PDA

Ver la Versión Completa : Capturar SQL que es pasada como parámetro


Paulao
08-08-2008, 18:52:49
Tengo uma Procedure con 3 parametros. Como hago para obter el valor de uno de estos parametro? Abajo mi procedure:
CriaComponente(4,'TB_MFD_CAPEADOR_REDUCAO','INSERT INTO TB_MFD_CAPEADOR_REDUCAO VALUES(' +
':PLoja,:PNu_Cx,:PDtMov,:PCoo,:PContReiOp,:PGeOpNFiscal,:PComprovCreDeb,' +
':PGerOpNFiscalCanc,:PGerRelGeren,:PContCCF,:PCCFCanc,:PContFitaDet,:PTotGeral,:PVendBrut,' +
':PCancICMS,:PDescICMS,:PTotISSQN,:PCancISSQN,:PDescISSQN,:PVendLiq,' +
':PAcreICMS,:PAcreISSQN,:PF1,:PI1,:PN1,:PFS1,:PIS1,:PNS1,:PCompNEmitido,' +
':PTempoEmit,:PTempoOper,:PMFD,:PNumRedRest,:PEquipamento,:PVersaoECF,' +
':PNumECF,:PParamECF,:PRel,:PBaseCalc,:PTotImposto,:PTotFormaPagReducao)');
Necesito de tercer parametro, que es onde estas la SQL com el INSERT. Estes parametros viene del Client. Como hago, para quando ejecutar el Client, yo capture lo que esta en la SQL?
Los parametros son: Cantidad de Primary Key(No se en español), el Nombre de la tabla(Esto va a crear mi DataSetProvider) e la SQL para ser ejecutada.

Paulao
08-08-2008, 19:04:28
Hizo asi, pero no logre exito:

var
s:String;
begin
s := CriaComponente([2]);
.....Asi no es posible. Error de tipo incompatible Integer y Set.

maeyanes
08-08-2008, 19:38:29
Hola!

Ese procedimiento es un procedimiento de Delphi?

Si es así, solo debes usar el nombre del parámetro y listo...

Si no, pues sería bueno que te expliques un poco mejor....


Saludos...

Paulao
08-08-2008, 19:50:20
Mira, mi procedure estás arriba(CriaComponente). Ella tiene 3 parametros. Como hago para capturar el tercer parametro? Mira que el tercer parametro, es un INSERT y necesito capturar el valor deste parametro.
CriaComponente(qtdCampoChave: Integer; nmTabela, SQL: string);
Quando ella for executada, necesito saber el valor de parametro SQL. Esto necesito, para pegar este valor y ejecutar en TOAD. Esta SQL es um parametro de mi procedure. No se si estoy sendo claro.

maeyanes
08-08-2008, 20:01:46
Hola!

No se si te estoy entendiendo bien, pero, para obtener el valor del tercer parámetro solo debes hacer:


procedure CriaComponente(qtdCampoChave: Integer; nmTabela, SQL: string);
var
SQLStr: string;

begin
SQLStr := SQL;
// Haces lo que necesitas...
end;


Voy bien o me regreso? :p



Saludos...

coso
08-08-2008, 20:08:37
Hola, deberias poner el codigo fuente de CriaComponent. Ten en cuenta que si cria component es un procedure, entonces nunca te devolvera una string, tal como parece que estas esperando. Deberias hacer, entonces,


function CriaComponente(qtdCampoChave: Integer; nmTabela, SQL: string) : string;
begin

...
CriaComponente := SQL;
end;



o bien hacer


procedure CriaComponente(qtdCampoChave : integer; nmTabela : string; var SQL string);
begin
...
// modificar variable SQL
...
end;

var
s : string;
begin
CriaComponente(1,'test',s);
ShowMessage(s); // s se ha modificado
end;


como digo, si pones el codigo fuente, nos entenderemos mejor ;) un saludo

coso
08-08-2008, 20:13:47
tambien puedes pasar un objeto query y una vez ejecutada la funcion, ver los resultados que tiene.


function CriaComponente(q : TAdoQuery; sql : string)
begin
...
q.Active := false;
q.SQL.Text := sql
if Pos('select',lowercase(sql)) <> 0 then
q.Active := true
else
q.ExecSQL;
end;

...

CriaComponente(query1_a_consultar,...)
showmessage(query1_a_consultar.FieldByName('total').asstring);
... // por ejemplo.

Paulao
08-08-2008, 20:20:57
CriaComponente(4,'TB_MFD_CAPEADOR_REDUCAO','INSERT INTO TB_MFD_CAPEADOR_REDUCAO VALUES(' +
':PLoja,:PNu_Cx,:PDtMov,:PCoo,:PContReiOp,:PGeOpNFiscal,:PComprovCreDeb,' +
':PGerOpNFiscalCanc,:PGerRelGeren,:PContCCF,:PCCFCanc,:PContFitaDet,:PTotGeral,:PVendBrut,' +
':PCancICMS,:PDescICMS,:PTotISSQN,:PCancISSQN,:PDescISSQN,:PVendLiq,' +
':PAcreICMS,:PAcreISSQN,:PF1,:PI1,:PN1,:PFS1,:PIS1,:PNS1,:PCompNEmitido,' +
':PTempoEmit,:PTempoOper,:PMFD,:PNumRedRest,:PEquipamento,:PVersaoECF,' +
':PNumECF,:PParamECF,:PRel,:PBaseCalc,:PTotImposto,:PTotFormaPagReducao)');

Este es el fuente. Necesito saber el valor de SQL. Los valores de parametros de SQL viene del Client. Solo necesito saber lo que estas pasando por el.

coso
08-08-2008, 20:25:43
pero...criacomponent de donde sale? no la has programado tu?

coso
08-08-2008, 20:27:23
igualmente, si criacomponent modifica una query a la que tengas acceso, le deberian quedar los valores dentro del query una vez pasada la funcion.

Paulao
08-08-2008, 20:45:09
Perdon, me olvide de poner el fuente corecto. Este es el fuente de CriaComponente. Estas en mi servidor de aplicaccion.
procedure TRDM_Consulta.CriaComponente(qtdCampoChave: Integer; nmTabela,
SQL: string);
var
qry: TSQLQuery;
dsp: TDataSetProvider;
begin
qry := TSQLQuery.Create(Self);
dsp := TDataSetProvider.Create(Self);
qry.Name := 'qry' + nmTabela;
dsp.Name := 'dsp' + nmTabela;
qry.SQLConnection := qryGeral.SQLConnection;
qry.SQL.Text := SQL;
dsp.DataSet := qry;
dsp.Exported := True;
dsp.UpdateMode := upWhereKeyOnly;
dsp.Options := dsp.Options + [poAllowCommandText];

case qtdCampoChave of
1: qry.AfterOpen := qryAfterOpen1Key;
2: qry.AfterOpen := qryAfterOpen2Key;
3: qry.AfterOpen := qryAfterOpen3Key;
4: qry.AfterOpen := qryAfterOpen4Key;
5: qry.AfterOpen := qryAfterOpen5Key;
6: qry.AfterOpen := qryAfterOpen6Key;
7: qry.AfterOpen := qryAfterOpen7Key;
8: qry.AfterOpen := qryAfterOpen8Key;
end;

dsp.OnDataRequest := dspDataRequestParam;
end;
Em mi client yo paso los valores del Sql:
if (dMov <> '') and (nCoo <> '') and (sCompNEmitido <> '') then
begin
DM_Create.ConectaMatriz;
with DM_Create.CDS_CapeReducao do
begin
Close;
Params[00].AsString := nLoja;
Params[01].AsString := sNu_Cx;
Params[02].AsString := dMov;
Params[03].AsString := nCoo;
Params[04].AsString := nContReiOp;
Params[05].AsString := nGeOpNFiscal;
Params[06].AsString := sComprovCreDeb;
Params[07].AsString := nGerOpNFiscalCanc;
Params[08].AsString := sGerRelGeren;
Params[09].AsString := nContCCF;
Params[10].AsString := nCCFCanc;
Params[11].AsString := nContFitaDet;
Params[12].AsString := nTotGeral;
Params[13].AsString := nVendBrut;
Params[14].AsString := sCancICMS;
Params[15].AsString := nDescICMS;
Params[16].AsString := nTotISSQN;
Params[17].AsString := sCancISSQN;
Params[18].AsString := nDescISSQN;
Params[19].AsString := nVendLiq;
Params[20].AsString := nAcreICMS;
Params[21].AsString := nAcreISSQN;
Params[22].AsString := sF1;
Params[23].AsString := sI1;
Params[24].AsString := sN1;
Params[25].AsString := sFS1;
Params[26].AsString := sIS1;
Params[27].AsString := sNS1;
Params[28].AsString := sCompNEmitido;
Params[29].AsString := sTempoEmit;
Params[30].AsString := sTempoOper;
Params[31].AsString := sMFD;
Params[32].AsString := nNumRedRest;
Params[33].AsString := sEquipamento;
Params[34].AsString := sVersaoECF;
Params[35].AsString := nNumECF;
Params[36].AsString := sParamECF;
Params[37].AsString := sRel;
Params[38].AsString := nBaseCalc;
Params[39].AsString := nTotImposto;
Params[40].AsString := nTotFormaPagReducao;

Execute;
......

Cambie todos por String, pero el eror es el mismo. Si yo paso directo CommandText, con los mismos valores, funciona. Pero por parametro y el CommandText en el Servidor de Aplicacion, entonces no funciona.

coso
08-08-2008, 21:20:20
No le veo solucion aparte de las que ya te he comentado: pasarle un query tambien como parametro,


procedure TRDM_Consulta.CriaComponente(qtdCampoChave: Integer;nmTabela, SQL: string; qry : TSQLquery);
var
dsp: TDataSetProvider;
begin
dsp := TDataSetProvider.Create(Self);
...
dsp.DataSet := qry;
dsp.Exported := True;
dsp.UpdateMode := upWhereKeyOnly;
dsp.Options := dsp.Options + [poAllowCommandText];
...


o bien que te devuelva un query


function TRDM_Consulta.CriaComponente(qtdCampoChave: Integer;nmTabela, SQL: string) : TSQLquery;
var
qry: TSQLQuery;
dsp: TDataSetProvider;
begin
qry := TSQLQuery.Create(Self);
dsp := TDataSetProvider.Create(Self);
qry.Name := 'qry' + nmTabela;
dsp.Name := 'dsp' + nmTabela
...
dsp.OnDataRequest := dspDataRequestParam;
CriaComponente := qry;
end;


ten en cuenta que en tu funcion no liberas qry ni dsp, por lo que la estas creando incontables veces.