Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Capturar SQL que es pasada como parámetro (https://www.clubdelphi.com/foros/showthread.php?t=58994)

Paulao 08-08-2008 18:52:49

Capturar SQL que es pasada como parámetro
 
Tengo uma Procedure con 3 parametros. Como hago para obter el valor de uno de estos parametro? Abajo mi procedure:
Cita:

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:
Cita:

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:

Cita:

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.
Cita:

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:

Código Delphi [-]
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,

Código Delphi [-]
function CriaComponente(qtdCampoChave: Integer; nmTabela, SQL: string) : string;
begin

     ...
     CriaComponente := SQL;
end;

o bien hacer

Código Delphi [-]
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.

Código Delphi [-]
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

Cita:

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.
Cita:

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:
Cita:

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,

Código Delphi [-]
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

Código Delphi [-]
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.


La franja horaria es GMT +2. Ahora son las 13:33:07.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi