Em posts anteriores o Eloi e eu demonstramos como utilizar Stored Procedures (SPs) com DataServer Oracle e SPs com DataServer SQL Server para ler ou alterar dados. Em algumas situações, porém, não é possível ou desejável criar uma SP.
O DataServer oferece suporte ao envio de sentenças SQL diretamente a partir do código 4GL / ABL. A sintáxe básica é:
DEF VAR ttH AS HANDLE NO-UNDO.
ASSIGN ttH = TEMP-TABLE ttResult:HANDLE.
RUN STORED-PROCEDURE send-sql-statement
LOAD-RESULT-INTO ttH
("Comandos SQL").
Neste exemplo, ttResult é uma temp-table previamente definida. Pode ser utilizada qualquer sentença aceita pelo banco de dados em questão. O DataServer irá repassar os comandos ao banco de dados na íntegra, sem nenhuma interferência.
É importante notar que este código não compila para um banco de dados Progress. Será gerado um erro indicando que a procedure SEND-SQL-STATEMENT não existe. Quando o programa precisa ser portável para vários bancos de dados (como é o caso dos programas Datasul), pode-se utilizar um pré-processador com a função DBTYPE, conforme exemplo abaixo:
DEFINE NEW SHARED TEMP-TABLE ttResult NO-UNDO
FIELD Categoria AS CHAR FORMAT "x(20)"
FIELD Subcategoria AS CHAR FORMAT "x(20)"
FIELD ValorTotal AS DECIMAL FORMAT ">,>>>,>>>,>>9.99".
DEF VAR pH AS HANDLE NO-UNDO.
&IF DBTYPE('aw') = 'MSS' &THEN
RUN sendsql.p PERSISTENT SET pH.
&ELSE
RUN abl.p PERSISTENT SET pH.
&ENDIF
RUN ProductSales IN pH.
DELETE PROCEDURE pH.
FOR EACH ttResult:
DISP ttResult.
END.
Durante a compilação, o pré-processador irá verificar o tipo do banco de dados e chamar o programa correspondente. Ambos os programas lêem o banco de dados e populam a temp-table ttResult, de formas completamente diferentes.
Abaixo você pode baixar os fontes dos exemplos sendsql.p e abl.p, e também um diagrama com a definição das tabelas do exemplo. O objetivos destes programas é produzir uma listagem com o total de vendas por categoria e subcategoria de produtos.
sendsql.p (1,06 kb)
abl.p (1,30 kb)
diagrama.png (64,25 kb)