Ir para conteúdo
Fórum Script Brasil

coisvaes

Membros
  • Total de itens

    9
  • Registro em

  • Última visita

Tudo que coisvaes postou

  1. Obrigado, Progr'amador. Valeu! O problema é que o campo PRODUTOID não existe na tabela VENDAS e quando tento carregar os campos em cdsVendas, dá erro por não existir o campo. Para fazer o relacionamento Master/Detail, de uma forma, digamos, "padrão", a instrução SQL seria assim: sdsVendas - select * from vendas e sdsItemVenda - select * from itemvenda where vendaid = :vendaid Só para lembrar, no relacionamento Master/Detail (com DataSetField) o nome do parametro, na tabela Detail, tem que ser, obrigatoriamente, igual ao nome do campo chave primaria na tabela Master. Observou o problema? Em "select * from itemvenda where vendaid = :vendaid", o nome do parametro é igual ao nome do campo chave primaria na tabela master, ou seja, :VENDAID. Mas, seu eu fizer "select * from itemvenda where vendaid = :vendaid and produtoid = :produtoid", PRODUTOID não existe na tabela Master, e dá erro quando tento carregar os campos em ClientDataSetVendas, mesmo que eu informe que o parametro :PRODUTOID é NULL.
  2. Tenho 2 Tabelas, conforme abaixo: Tabela VENDAS (Master) PedidoID CommandText - 'select * from VENDAS' tabela VENDAITEM (Detail) PedidoID ProdutoID CommandText - 'select * from VENDAITEM where PedidoID = :PedidoID and ProdutoID = :ProdutoID' Estou ligando o Detail ao Master através de um DataSource e do DataSetField, do ClientDataSet. Supondo que eu precise selecionar somente o ProdutoID igual a 10. O valor do parametro :ProdutoID seria enviado a partir do click de um botão, mais ou menos assim: sdsVendaItem.Open; sdsVendaItem.Params.ParamByName('PRODUTOID').Value := 10; sdsVendaItem.Open; O problema é que o campo PRODUTOID existe na tabela VENDAITEM mas NÃO EXISTE na tabela VENDAS e, quando tento carregar os campos em sdsVendas, sou informado que o campo PRODUTOID não existe. Para resolver isso estou usando: cdsVendaItem.Filter := 'PRODUTOID ='+10; Entretanto, preciso resolver isto na instrução SQL porque a tabela ITEMVENDA tem mais de 1 milhão de registros. Se eu fizer "SELECT * FROM VENDAITEM WHERE VENDAID = :VENDAID AND PRODUTOID = 10" não dá erro, mas, preciso usar o paramentro, pois, é o usuário quem vai escolher o produto.
  3. Olá, (Resolvido) Compilando o programa no Delphi 2007 não tive mais os problemas dos erros citados. Obrigado a todos pela atenção, Francisco Rodrigues
  4. Outra observação: Não estou passando um valor nulo para o campo e sim, atribuindo NULL ao Parametro que será utilizado na clausula WHERE da Query, ou seja: SELECT * FROM CLIENTE WHERE CODIGO = NULL. Ou estou enganado?
  5. Olá, amigo Douglas Soares, Realmente, atribuindo um valor válido ao parametro, não dá erro. Mas, a idéia é, ao criar o form, alimentar o valor deste parâmetro com NULL. Desta forma o ClientDataSet será aberto e nenhum registro será trafegado, já que não existem registros com chave nula. Assim ele estará vazio, pronto para receber um novo registro a ser cadastrado. Testei isto em outra aplicação, utilizando o mesmo banco de dados, conforme abaixo, e não deu erro. A Query foi parametrizada assim: SELECT CODIGO, NOME FROM CLIENTE WHERE CODIGO = :CODIGO Ajustei o parâmetro ‘CODIGO’ assim: DataType: ftInteger ParamType: ptImput E, no OnCreate do formulário fiz assim: DM := TDM.Create(Self); DM.ClientDataSet.FetchParams; DM.ClientDataSet.Params.ParamByName(‘CODIGO’).Value := NULL; DM.ClientDataSet.Open; {Aqui dá erro em uma aplicação e em outra, não} O que me deixa intrigado é o fato de um conceito funcionar normalmente em uma aplicação e, em outra, não. De qualquer forma, sua ajuda foi de grande importância. Muitíssimo obrigado. E, quanto à acentuação, alguma dica? Francisco Rodrigues
  6. Olá, Pessoal, Estou desenvolvendo uma aplicação com Delphi 7, ClientDataSet e DBExpress com Firebird 1.5 e, de um momento para o outro, começaram a aparecer as seguintes mensagens de erro: 1) Project Teste.exe raised exception class EDatabaseError with message 'arithmetic exception, numeric overflow, or string truncation Cannot transliterate character between character sets '. Process stoped. - Esta mensagem aparece quando digíto alguma palavra com acento, mesmo estando utilizando WIN1252 na criação do banco de dados e no SQLConnection. Na tentativa de isolar o problema, fiz uma nova aplicação utilizando o mesmo banco de dados e o erro não ocorreu. 2) Nesta mesma aplicação, incialmente eu utilizava em SQLQuery.SQL=SELECT * FROM <TABELA>. Como esta tabela possui muitos registros, mudei para SELECT * FROM <TABELA> WHERE NUMERO = :NUMERO, ajustei SQLQuery.PARAMS e, no evento OnCreate do formulario fiz assim: procedure TfrmTeste.FormCreate(Sender: TObject); begin dmTeste := TdmTeste.Create(Self); dmTeste.ClientDataSetTeste.FetchParams; dmTeste.ClientDataSetTeste.Params.ParamByName('NUMERO').Value := NULL; { ou dmTeste.SQLQuery.Params.ParamByName('NUMERO').Value := NULL; } dmTeste.ClientDataSetTeste.Open; end; Mas, depois desta alteração, aparece a mensagem de erro ‘(…) raised exception class EAccessViolation with message 'Access violation at address 004023D2 in module… ' em: dmTeste.ClientDataSetTeste.Open; Fiz o mesmo procedimento em outra aplicação e, também não deu erro! Alguém sabe como resolver isso sem que seja necessário refazer a aplicação e, principalmente, como evitar que estes erros aconteçam? Desde já, muitíssimo obrigado. Francisco Rodrigues
  7. Oi, Jhonas. Valeu, amigo. Resolvido. Definindo o campo como você sugeriu (BLOB sub_type 1 segment size 80 CHARACTER SET WIN1252), o problema foi resolvido. Muitíssimo obrigado. Um Abraço, Francisco Rodrigues
  8. Oi, Jhonas. Obrigado pela ajuda. Fazendo do jeito que você sugeriu não dá erro, entretanto, as vezes preciso que este campo esteja vazio. Sei que tem como contornar isso, usando o mesmo princípio que você adotou. Mas, por que isto acontece? Testei com o DBRichText e isto não ocorreu, entretanto, preciso do DBMemo, melhor para texto simples. Outro teste que fiz foi refazer o formulário, o que também resolveu o problema, mas, não parece uma boa solução refazer o formulário sempre que um erro desses aparecer. Um abraço.
  9. Olá, Pessoal. Meu aplicativo está apresentando a mensagem de erro "Project xxxx raised exception class 'EAccessViolation' with message 'Access violation at address 004023d2 in module <aplicativo.exe>. Read of address FFFFFFFC. Isto ocorre sempre que, depois de um Edit ou Insert, tento gravar (ApplyUpdates) o registro e o campo DBMemo (ligado a um campo Blob sub_type 1, Firebird 1.5) não contem dados. Isto não ocorre quando o DBMemo contém dados. Desde já, obrigado pela ajuda. No botão gravar, fiz assim: procedure TfrmForm.BtnGravarClick(Sender: TObject); begin if DM.ClientDataSet1.State in [dsEdit, dsInsert] then begin DM.ClientDataSet1.Post; if DM.ClientDataSet1.ApplyUpdates(0) <> 0 then DM.ClientDataSet1.CancelUpdates; end; end;
×
×
  • Criar Novo...