Fórum Firebird-Erro ao Abrir Tabelas Mestre-Detalhe #367402
29/12/2008
0
:?: Olá a todos,
uso Delphi 7 + SqlConnection + SqlDataSet + DataSetProvider + ClientDataSet + DataSource.
Tenho um programa de cadastro de pedidos (mestre - detalhe).
Até hoje abria a tabela mestre com todos os registros e posicionava no último registro.
Agora preciso abrir somente um registro da tabela que no início é o último registro cadastrado, depois será o registro selecionado pelo operador.
Na primeira vez que chamo o programa a partir do menu tudo funciona muito bem, consulto, cadastro, altero, etc..
Quando saio do programa, retorno ao menu e volto no mesmo programa o sistema me retorna um erro:
SqlItp: Parameter ´CODIGO´ not found.
E não deixa mais entrar no programa somente se sair do sistema e entrar novamente.
Veja abaixo a estrutura que uso.
Criei no sistema variáveis dos tipos: SqlDataSet, DataSetProvider, ClientDataSet e DataSource conforme abaixo:
V_SqlCnctn : TSqlConnection;
V_SqlDtSt : TSqlDataSet;
V_DtStPrv : TDataSetProvider;
V_CliDtSt : TClientDataSet;
V_DtSource : TDataSource;
Antes de chamar o programa fecho as tabelas e passo parametros:
DmDados.CdsPed.Close;
DmDados.SqlPed.Close;
DmDados.CdsItp.Close;
DmDados.SqlItp.Close;
// --- parametro tabela mestre
V_SqlDtSt := DmDados.SqlPed;
V_DtStPrv := Dmdados.PrvPed;
V_CliDtSt := DmDados.CdsPed;
V_DtSource := DmDados.DsPed;
// --- parametro tabela detalhe
V_ItSqlDtSt := DmDados.SqlItp;
V_ItDtStPrv := Dmdados.PrvItp;
V_ItCliDtSt := DmDados.CdsItp;
V_ItDtSource := DmDados.DsItp;
// --- pegar o ultimo codigo de pedido cadastrado
V_Chave := dmdados.CliDtStSequencias.fieldbyname(´Ped_Cod´).AsString;
// --- ler SQL para tabela mestre (esta SQL é retornada da função abaixo)
V_SqlMestre := SqlPedidosMestre;
function SqlPedidosMestre : string;
begin
Result := ´Select A.Ped_Cod, A.Ped_DtCadastro, A.Ped_DtPedido, A.Ped_DtAlteracao, ´ +
´A.Ped_DtEntregaCliente, A.Ped_NroPedCliente, A.Ped_NroPedFabrica, ´ +
´B.Cli_RazaoSocial, B.Cli_Cep, B.Cli_Endereco, B.Cli_Pabx, B.Cli_Bairro, ´ +
´C.Fbr_RazaoSocial, C.Fbr_Fantasia, ´ +
´H.Rpr_Apelido ´ +
´FROM PEDIDOSMESTRE A ´ +
´INNER JOIN CLIENTES B ON A.CLI_COD = B.CLI_COD ´ +
´INNER JOIN FABRICAS C ON A.FBR_COD = C.FBR_COD ´ +
´INNER JOIN REPRESENTANTES H ON A.RPR_COD = H.RPR_COD ´ +
´WHERE A.PED_COD = :CODIGO ´ +
´ ORDER BY A.PED_COD ´;
end;
// --- abrir mestre
V_SqlDtSt.Close;
V_Clidtst.Close;
V_SqlDtSt.CommandText := V_SqlMestre;
V_SqlDtSt.ParamByName(´Codigo´).AsString := V_Chave;
V_CliDtSt.Open;
// --- ler SQL para tabela detalhe (esta SQL é retornada da função abaixo)
V_SqlDetalhe := SqlPedidosDetalhe;
function SqlPedidosDetalhe : string;
begin
Result := ´Select A.Ped_Cod, A.Itp_Item, A.Ref_RefFabrica, A.Grd_Cod, ´ +
´A.Itp_VlrUnitBruto, ´ +
´ B.Grd_Prefixo ´ +
´FROM PEDIDOSDETALHE A ´ +
´INNER JOIN GRADENUMERACAO B ON A.GRD_COD = B.GRD_COD ´ +
´WHERE A.PED_COD = :CODIGO ´ +
´ ORDER BY A.PED_COD, A.ITP_ITEM ´;
end;
// --- abrir detalhe
V_ItSqlDtSt.Close;
V_ItClidtst.Close;
V_ItSqlDtSt.CommandText := V_SqlDetalhe;
V_ItSqlDtSt.ParamByName(´Codigo´).AsString := V_Chave;
V_ItCliDtSt.Open;
// --- chamar o programa
try
FrCadPedidos := TFrCadPedidos.Create(Application);
FrCadPedidos.ShowModal;
finally
FrCadPedidos := Nil;
end;
// --- ao fecha o programa no evento OnClose
procedure TFrCadPedidos.FormClose(Sender: TObject; var Action: TCloseAction);
begin
inherited;
{ Libera o formulário }
V_SqlDtSt.Close;
V_CliDtSt.Active := False;
V_ItSqlDtSt.Close;
V_ItCliDtSt.Active := False;
Action := caFree;
FrCadPedidos := Nil;
end;
Abraços e obrigado
Neto
uso Delphi 7 + SqlConnection + SqlDataSet + DataSetProvider + ClientDataSet + DataSource.
Tenho um programa de cadastro de pedidos (mestre - detalhe).
Até hoje abria a tabela mestre com todos os registros e posicionava no último registro.
Agora preciso abrir somente um registro da tabela que no início é o último registro cadastrado, depois será o registro selecionado pelo operador.
Na primeira vez que chamo o programa a partir do menu tudo funciona muito bem, consulto, cadastro, altero, etc..
Quando saio do programa, retorno ao menu e volto no mesmo programa o sistema me retorna um erro:
SqlItp: Parameter ´CODIGO´ not found.
E não deixa mais entrar no programa somente se sair do sistema e entrar novamente.
Veja abaixo a estrutura que uso.
Criei no sistema variáveis dos tipos: SqlDataSet, DataSetProvider, ClientDataSet e DataSource conforme abaixo:
V_SqlCnctn : TSqlConnection;
V_SqlDtSt : TSqlDataSet;
V_DtStPrv : TDataSetProvider;
V_CliDtSt : TClientDataSet;
V_DtSource : TDataSource;
Antes de chamar o programa fecho as tabelas e passo parametros:
DmDados.CdsPed.Close;
DmDados.SqlPed.Close;
DmDados.CdsItp.Close;
DmDados.SqlItp.Close;
// --- parametro tabela mestre
V_SqlDtSt := DmDados.SqlPed;
V_DtStPrv := Dmdados.PrvPed;
V_CliDtSt := DmDados.CdsPed;
V_DtSource := DmDados.DsPed;
// --- parametro tabela detalhe
V_ItSqlDtSt := DmDados.SqlItp;
V_ItDtStPrv := Dmdados.PrvItp;
V_ItCliDtSt := DmDados.CdsItp;
V_ItDtSource := DmDados.DsItp;
// --- pegar o ultimo codigo de pedido cadastrado
V_Chave := dmdados.CliDtStSequencias.fieldbyname(´Ped_Cod´).AsString;
// --- ler SQL para tabela mestre (esta SQL é retornada da função abaixo)
V_SqlMestre := SqlPedidosMestre;
function SqlPedidosMestre : string;
begin
Result := ´Select A.Ped_Cod, A.Ped_DtCadastro, A.Ped_DtPedido, A.Ped_DtAlteracao, ´ +
´A.Ped_DtEntregaCliente, A.Ped_NroPedCliente, A.Ped_NroPedFabrica, ´ +
´B.Cli_RazaoSocial, B.Cli_Cep, B.Cli_Endereco, B.Cli_Pabx, B.Cli_Bairro, ´ +
´C.Fbr_RazaoSocial, C.Fbr_Fantasia, ´ +
´H.Rpr_Apelido ´ +
´FROM PEDIDOSMESTRE A ´ +
´INNER JOIN CLIENTES B ON A.CLI_COD = B.CLI_COD ´ +
´INNER JOIN FABRICAS C ON A.FBR_COD = C.FBR_COD ´ +
´INNER JOIN REPRESENTANTES H ON A.RPR_COD = H.RPR_COD ´ +
´WHERE A.PED_COD = :CODIGO ´ +
´ ORDER BY A.PED_COD ´;
end;
// --- abrir mestre
V_SqlDtSt.Close;
V_Clidtst.Close;
V_SqlDtSt.CommandText := V_SqlMestre;
V_SqlDtSt.ParamByName(´Codigo´).AsString := V_Chave;
V_CliDtSt.Open;
// --- ler SQL para tabela detalhe (esta SQL é retornada da função abaixo)
V_SqlDetalhe := SqlPedidosDetalhe;
function SqlPedidosDetalhe : string;
begin
Result := ´Select A.Ped_Cod, A.Itp_Item, A.Ref_RefFabrica, A.Grd_Cod, ´ +
´A.Itp_VlrUnitBruto, ´ +
´ B.Grd_Prefixo ´ +
´FROM PEDIDOSDETALHE A ´ +
´INNER JOIN GRADENUMERACAO B ON A.GRD_COD = B.GRD_COD ´ +
´WHERE A.PED_COD = :CODIGO ´ +
´ ORDER BY A.PED_COD, A.ITP_ITEM ´;
end;
// --- abrir detalhe
V_ItSqlDtSt.Close;
V_ItClidtst.Close;
V_ItSqlDtSt.CommandText := V_SqlDetalhe;
V_ItSqlDtSt.ParamByName(´Codigo´).AsString := V_Chave;
V_ItCliDtSt.Open;
// --- chamar o programa
try
FrCadPedidos := TFrCadPedidos.Create(Application);
FrCadPedidos.ShowModal;
finally
FrCadPedidos := Nil;
end;
// --- ao fecha o programa no evento OnClose
procedure TFrCadPedidos.FormClose(Sender: TObject; var Action: TCloseAction);
begin
inherited;
{ Libera o formulário }
V_SqlDtSt.Close;
V_CliDtSt.Active := False;
V_ItSqlDtSt.Close;
V_ItCliDtSt.Active := False;
Action := caFree;
FrCadPedidos := Nil;
end;
Abraços e obrigado
Neto
Neto
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)