Debugar uma procedure
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:
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?
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
Curtidas 0
Respostas
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
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
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
08/08/2008
seu servidor de aplicação é um exe ou COM+ ?
GOSTEI 0
Paulo
08/08/2008
Emerson escreveu
exe
seu servidor de aplicação é um exe ou COM+ ?
exe
GOSTEI 0
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.
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
08/08/2008
Não é isso não emerson. Veja abaixo a minha procedure CriaComponente:
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.
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
08/08/2008
ah, agora entendi...
se você estiver utilizando provider, pegue os valores no evento BeforeExecute.
se você estiver utilizando provider, pegue os valores no evento BeforeExecute.
GOSTEI 0
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
08/08/2008
crie um procedimento com o cabeçalho padrão do evento BeforeExecute e associe seus providers a esse evento.
por exemplo:
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)
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