problema no post firebird
Bom dia, Amigos!
estou com um grande problema aqui, tem dois dias que não consigo sair dele e a ajuda de voces vai ser de excelente valia.
quando estou dando post na tabela (DM.cdsOcoInclude.Post;) ele dá o erro:
Project project1.exe raised exception class EDBClient with message ´´. Process stopped. use step or Run to continue.
Essa tabela de ocorrencias, tem um campo que criei uma trigger para auto-incrementar o campo CODIGOocorrencia.
Se eu defino:
DM.cdsOcoIncludeCODIGOOCORRENCIAS.AsString := ´1´;
DM.cdsOcoInclude.Post;
ele grava no post sem problema, mas assim, não incrementa o campo Codigo, e todos os registros ficam com CODIGOOCORRENCIAS = 1
Ou seja, não resolve
estou nessa briga a facadas com essas duas linhas tem umas 20 horas seguidas... please!! alguem pode me ajudar?
estou com um grande problema aqui, tem dois dias que não consigo sair dele e a ajuda de voces vai ser de excelente valia.
quando estou dando post na tabela (DM.cdsOcoInclude.Post;) ele dá o erro:
Project project1.exe raised exception class EDBClient with message ´´. Process stopped. use step or Run to continue.
Essa tabela de ocorrencias, tem um campo que criei uma trigger para auto-incrementar o campo CODIGOocorrencia.
Se eu defino:
DM.cdsOcoIncludeCODIGOOCORRENCIAS.AsString := ´1´;
DM.cdsOcoInclude.Post;
ele grava no post sem problema, mas assim, não incrementa o campo Codigo, e todos os registros ficam com CODIGOOCORRENCIAS = 1
Ou seja, não resolve
estou nessa briga a facadas com essas duas linhas tem umas 20 horas seguidas... please!! alguem pode me ajudar?
Garciabh3
Curtidas 0
Respostas
Landersongomes
17/01/2007
Boa tare amigo...
Vc está usando acesso via dbExperss?
Caso seja procure sobre providerFlags dos Tfields...
Uma outra opção seria vc usar uma query informando o valor max de codigo e acrescentar um a este... tipo:
if dmSAE.cdsCadDoctosID_DOCTO.IsNull then
dmSAE.cdsCadDoctosID_DOCTO.AsInteger :=
dmSAE.cdsMaxDoctoMAX.AsInteger + 1;
dmSAE.cdsCadDoctos.Post;
Lembrando sempre de abrir a query antes e fechar depois das atualizações.
Vc está usando acesso via dbExperss?
Caso seja procure sobre providerFlags dos Tfields...
Uma outra opção seria vc usar uma query informando o valor max de codigo e acrescentar um a este... tipo:
if dmSAE.cdsCadDoctosID_DOCTO.IsNull then
dmSAE.cdsCadDoctosID_DOCTO.AsInteger :=
dmSAE.cdsMaxDoctoMAX.AsInteger + 1;
dmSAE.cdsCadDoctos.Post;
Lembrando sempre de abrir a query antes e fechar depois das atualizações.
GOSTEI 0
Aroldo Zanela
17/01/2007
Colega,
Você está usando ClientDataSet? Se sim, usou ApplyUpdates(-1)? Pode colocar um fragmento maior do código?
Você está usando ClientDataSet? Se sim, usou ApplyUpdates(-1)? Pode colocar um fragmento maior do código?
GOSTEI 0
Emerson Nascimento
17/01/2007
altere a propriedade Required do campo DM.cdsOcoIncludeCODIGOOCORRENCIAS para False e grave sem passar qualquer valor para ele (deixe nulo).
veja se resolve
veja se resolve
GOSTEI 0
Garciabh3
17/01/2007
nó!!!.. brigadão por estarem me ajudando
landersongomes:
Sim, estou usando dbExpress e ClientDataSet
Aroldo:
ele dá pau no post, antes do applyupdates
(não chega na parte do apply)
trecho do codigo mais detalhado:
é simples, mas to apanhando de 20 a 0
emerson:
já tinha alterado a Flag para required false, mas se eu não passo nada para o campo, dá aquela mensagem de erro sinistra. se eu passo, funciona (mas não auto-incrementa)
landersongomes:
Sim, estou usando dbExpress e ClientDataSet
Aroldo:
ele dá pau no post, antes do applyupdates
(não chega na parte do apply)
trecho do codigo mais detalhado:
if (Funcao = ´Inserir´) then begin DM.cdsOcoInclude.Open; DM.cdsOcoInclude.insert; DM.cdsOcoIncludeDATA.AsString := DateToStr(now); DM.cdsOcoInclude.Post; DM.cdsOcoInclude.ApplyUpdates(0); end;
é simples, mas to apanhando de 20 a 0
emerson:
já tinha alterado a Flag para required false, mas se eu não passo nada para o campo, dá aquela mensagem de erro sinistra. se eu passo, funciona (mas não auto-incrementa)
GOSTEI 0
Garciabh3
17/01/2007
AAAAAAAAAAAAAAAEEEEEEEEEEEEEEEEEEWWWWWWWWWWWWWWWW!!!
UWHOOOOOOOO
funcionou!!!
brigadão pela luz!!!
consegui alterando a trigger
CREATE TRIGGER TRG_OCORRENCIAS_INC
FOR OCORRENCIAS ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
if (NEW.CODIGOOCORRENCIAS = 0) then
NEW.CODIGOOCORRENCIAS = GEN_ID(GEN_OCORRENCIAS_ID, 1);
END
sem o if (NEW.CODIGOOCORRENCIAS = 0) then
quando eu ia editar, ele fazia uma confusão doida
era mesmo problema de trigger, agora deu!
pra quem ler este post no futuro com esta duvida,
eu passo o
DM.cdsOcoIncludeCODIGOOCORRENCIAS.AsInteger := 0;
e uso o novo trigger
nó... que luta!!!
valeu, gente
UWHOOOOOOOO
funcionou!!!
brigadão pela luz!!!
consegui alterando a trigger
CREATE TRIGGER TRG_OCORRENCIAS_INC
FOR OCORRENCIAS ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
if (NEW.CODIGOOCORRENCIAS = 0) then
NEW.CODIGOOCORRENCIAS = GEN_ID(GEN_OCORRENCIAS_ID, 1);
END
sem o if (NEW.CODIGOOCORRENCIAS = 0) then
quando eu ia editar, ele fazia uma confusão doida
era mesmo problema de trigger, agora deu!
pra quem ler este post no futuro com esta duvida,
eu passo o
DM.cdsOcoIncludeCODIGOOCORRENCIAS.AsInteger := 0;
e uso o novo trigger
nó... que luta!!!
valeu, gente
GOSTEI 0
Bruno.sensatta
17/01/2007
ola... eu trabalho com banco de dados oracle, não sei se é o mesmo que vc utiliza, mas se for tenhu uma solução legal para esse problema, vc poderia ao inves de utilizar uma triger utilizar uma sequence, é mais lógico do que disparar uma triger quando for gravar, com a sequence vc consegue trazer o próximo valor na hora em que for começar ainserir os dados, vamus a um exemplo
CREATE SEQUENCE <NOME_DA_SEQUENCE>
minvalue 1
maxvalue 99999999999
start with 1
increment by 1
nocache;
esta criada a sequence, agora para chama-la basta vc colocar no evento after insert do Client data set a seguinte query
Select <nome_da_sequence>.nextvalue SEQUENCIAL from dual
simples não acha ??
só entendendo o que fiz, montei um select e renomei o nome da coluna que ira retornar para SEQUENCIAL, agora basta vc atribuir o valor desta coluna no campo onde deseja exibila, ou passa-la para o client data set no respectivo campo....
Espero ter ajudado um pouco mais,
Abraços!!
CREATE SEQUENCE <NOME_DA_SEQUENCE>
minvalue 1
maxvalue 99999999999
start with 1
increment by 1
nocache;
esta criada a sequence, agora para chama-la basta vc colocar no evento after insert do Client data set a seguinte query
Select <nome_da_sequence>.nextvalue SEQUENCIAL from dual
simples não acha ??
só entendendo o que fiz, montei um select e renomei o nome da coluna que ira retornar para SEQUENCIAL, agora basta vc atribuir o valor desta coluna no campo onde deseja exibila, ou passa-la para o client data set no respectivo campo....
Espero ter ajudado um pouco mais,
Abraços!!
GOSTEI 0
Bruno.sensatta
17/01/2007
ola... eu trabalho com banco de dados oracle, não sei se é o mesmo que vc utiliza, mas se for tenhu uma solução legal para esse problema, vc poderia ao inves de utilizar uma triger utilizar uma sequence, é mais lógico do que disparar uma triger quando for gravar, com a sequence vc consegue trazer o próximo valor na hora em que for começar ainserir os dados, vamus a um exemplo
CREATE SEQUENCE <NOME_DA_SEQUENCE>
minvalue 1
maxvalue 99999999999
start with 1
increment by 1
nocache;
esta criada a sequence, agora para chama-la basta vc colocar no evento after insert do Client data set a seguinte query
Select <nome_da_sequence>.nextvalue SEQUENCIAL from dual
simples não acha ??
só entendendo o que fiz, montei um select e renomei o nome da coluna que ira retornar para SEQUENCIAL, agora basta vc atribuir o valor desta coluna no campo onde deseja exibila, ou passa-la para o client data set no respectivo campo....
Espero ter ajudado um pouco mais,
Abraços!!
CREATE SEQUENCE <NOME_DA_SEQUENCE>
minvalue 1
maxvalue 99999999999
start with 1
increment by 1
nocache;
esta criada a sequence, agora para chama-la basta vc colocar no evento after insert do Client data set a seguinte query
Select <nome_da_sequence>.nextvalue SEQUENCIAL from dual
simples não acha ??
só entendendo o que fiz, montei um select e renomei o nome da coluna que ira retornar para SEQUENCIAL, agora basta vc atribuir o valor desta coluna no campo onde deseja exibila, ou passa-la para o client data set no respectivo campo....
Espero ter ajudado um pouco mais,
Abraços!!
GOSTEI 0
Bruno.sensatta
17/01/2007
me desculpe agora eu vi que seu bando é firebird, mas acho que o comando para criação da sequence deve ser o mesmo... espero ter ajudadoo!!
=)
=)
GOSTEI 0