Fórum Debugar uma procedure #362288

08/08/2008

0

Tenho um servidor de aplicação, que tem uma procedure onde do cliente via parametros, eu executo essa procedure no servidor. Como está dando erro em um parametro, gostaria de capturar o sql que está sendo passado, para rodar dentro do TOAD e ver o que realmente está acontecendo. A procedure está abaixo:
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)´);

O Terceiro parametro dessa Procedure(O INSERT...) eu preciso capturar(Os valores dos parametros) e rodar no TOAD e ver o que está errado. Os valores dos parametros vêm da camada Cliente. Como faço? Fui claro?


Paulo

Paulo

Responder

Posts

08/08/2008

Paulo

Não sei como debugar, mas descobri o que está acontecendo. Quando estava dando insert direto da aplicação(antes era assim), eu passava o valor dos atributos Numericos com um ponto para separar o decimal, já que a virgula confundia o Sql como separador de atributos. Como estamos mudando tudo para SA, não vou passar CommandText pela rede ou remoto, logo executo a query no server, com o Client passando os parametros dos Insert´s. Logo, mudei de ponto para virgula e não deu mais o erro, mas agora o Oracle não aceita, dando o seguinte erro:
ORA-01858: A non-numeric character was found where a numeric was expected
Como eu contorno isso?


Responder

Gostei + 0

08/08/2008

Paulo

Já tentei de tudo. Será possível pegar pelo AppServer do Socket? Se for possível, como faço isso?


Responder

Gostei + 0

08/08/2008

Paulo

Se fizer assim, funciona, mas eu não quero passar CommandText via Rede ou Remoto(Principalmente)
CommandText := ´INSERT INTO TB_MFD_CAPEADOR_REDUCAO VALUES(´ + nLoja + ´,´ + sNu_Cx + ´,´ + dMov + ´,´ + nCoo + ´,´ + nContReiOp + ´,´ + nGeOpNFiscal + ´,´ + sComprovCreDeb + ´,´ + nGerOpNFiscalCanc + ´,´ + sGerRelGeren + ´,´ + nContCCF + ´,´ + nCCFCanc + ´,´ + nContFitaDet + ´,´ + nTotGeral + ´,´ + nVendBrut + ´,´ + sCancICMS + ´,´ + nDescICMS + ´,´ + nTotISSQN + ´,´ + sCancISSQN + ´,´ + nDescISSQN + ´,´ + nVendLiq + ´,´ + nAcreICMS + ´,´ + nAcreISSQN + ´,´ + sF1 + ´,´ + sI1 + ´,´ + sN1 + ´,´ + sFS1 + ´,´ + sIS1 + ´,´ + sNS1 + ´,´ + sCompNEmitido + ´,´ + sTempoEmit + ´,´ + sTempoOper + ´,´ + sMFD + ´,´ + nNumRedRest + ´,´ + sEquipamento + ´,´ + sVersaoECF + ´,´ + nNumECF + ´,´ + sParamECF + ´,´ + sRel + ´,´ + nBaseCalc + ´,´ + nTotImposto + ´,´ + nTotFormaPagReducao + ´)´; Execute;



Responder

Gostei + 0

08/08/2008

Emerson Nascimento

seu servidor de aplicação é um exe ou COM+ ?


Responder

Gostei + 0

09/08/2008

Paulo

Emerson escreveu
seu servidor de aplicação é um exe ou COM+ ?

exe


Responder

Gostei + 0

09/08/2008

Emerson Nascimento

se é um exe, vc debuga normalmente.
abra o projeto do aplicativo servidor no Delphi, pressione F9. depois abra o aplicativo cliente ´por fora´. no momento que a procedure for requisitada, ela será interceptada pelo ´debuguer´ do Delphi.


Responder

Gostei + 0

11/08/2008

Paulo

Não é isso não emerson. Veja abaixo a minha procedure CriaComponente:
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)´);

Ela tem tres parâmetros. O terceiro é uma Instrução SQL que os ´parâmetros´ do Sql(não da procedure), vêm do cliente. É isso que eu quero pegar, saber o que está passando por ele. Como está dando um erro, gostaria de pegar esse SQL e rodar dentro do TOAD para ver onde está o erro. Se eu passar os mesmos parâmtero, mas como um CommandText do Cliente, não dá esse erro. E isso que eu quero debugar, e não uma procedure do delphi.


Responder

Gostei + 0

12/08/2008

Emerson Nascimento

ah, agora entendi...
se você estiver utilizando provider, pegue os valores no evento BeforeExecute.


Responder

Gostei + 0

12/08/2008

Paulo

Como faço? Meus providers são criados dinamicamente pela procedure CriaComponente. Como faço então?


Responder

Gostei + 0

12/08/2008

Emerson Nascimento

crie um procedimento com o cabeçalho padrão do evento BeforeExecute e associe seus providers a esse evento.

por exemplo:
procedure TDM.ProviderBeforeExecute(Sender: TObject;
  var OwnerData: OleVariant);
var
  i: integer;
  lista: string;
begin
  lista := ´´;

  with TSQLDataset(TDataSetProvider(Sender).DataSet) do
    if Params.Count > 0 then
      for i := 0 to Params.Count -1 do
      begin
        if lista <> ´´ then lista := lista + #13;
        lista := lista + Params[i].Name + ´ = ´ + Params[i].AsString;
      end;

  if lista <> ´´ then
    ShowMessage(lista);
end;


daí, quando você criar seus providers, associe o evento BeforeExecute à esse procedimento.
dsp := TDatasetProvider.Create(X);
dsp.BeforeExecute := ProviderBeforeExecute;
etc...

(note que da forma que eu te passei, será exibida uma mensagem pelo aplicativo servidor)


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar