Debugar uma procedure

Delphi

08/08/2008

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

Curtidas 0

Respostas

Paulo

Paulo

08/08/2008

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?


GOSTEI 0
Paulo

Paulo

08/08/2008

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


GOSTEI 0
Paulo

Paulo

08/08/2008

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;



GOSTEI 0
Emerson Nascimento

Emerson Nascimento

08/08/2008

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


GOSTEI 0
Paulo

Paulo

08/08/2008

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

exe


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

08/08/2008

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.


GOSTEI 0
Paulo

Paulo

08/08/2008

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.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

08/08/2008

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


GOSTEI 0
Paulo

Paulo

08/08/2008

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


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

08/08/2008

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)


GOSTEI 0
POSTAR