Não grava no banco com DateTimePiker

Delphi

31/05/2009

to tentando usar o datetimerpicker pela primeira vez, mas nao to conseguindo gravar no banco. Tenho um formulario e quero gravar a data selecionada neste componente. To usando o firebird, dbexpress. Abaixo o codigo:

no evento onchange do datetimerpicker:

procedure TfrmPrincipal.DateTimePicker1Change(Sender: TObject);
begin
DataModule1.ClientDataSet1.Edit;
DataModule1.ClientDataSet1DATA_ENTREGA.Value:= DateTimePicker1.Date;
DataModule1.ClientDataSet1.Post;
end;

Alguem me ajuda? Obrigado.


Caube

Caube

Curtidas 0

Respostas

Developer1978

Developer1978

31/05/2009

Depois da linha DataModule1.ClientDataSet1.Post coloque
DataModule1.ClientDataSet1.ApplyUpdate(0);


GOSTEI 0
Caube

Caube

31/05/2009

esse comando já existe quando eu clico em gravar.


GOSTEI 0
Developer1978

Developer1978

31/05/2009

Fiz esse teste aqui com DBExpress e firebird e gravou normalmente.
procedure TFormCadProdutos.DateTimePicker1Change(Sender: TObject);
begin
DM.cds_Cad_Produtos.Edit;
DM.cds_Cad_ProdutosDTALT.AsDateTime := DateTimePicker1.Date;
DM.cds_Cad_Produtos.Post;
DM.cds_Cad_Produtos.ApplyUpdates(0);
end;

procedure TFormCadProdutos.btnGravarClick(Sender: TObject);
begin
if DM.cds_Cad_Produtos.State = dsEdit then
begin
DM.cds_Cad_ProdutosDTALT.AsDateTime := DateTimePicker1.Date;
DM.cds_Cad_Produtos.Post;
DM.cds_Cad_Produtos.ApplyUpdates(0);
end;
end;


GOSTEI 0
Henrique Rodrigues

Henrique Rodrigues

31/05/2009

tenho o mesmo problema, o pior é que tenho um exmplo de um livro aqui e funciona, mas no que eu fiz não.

faz o post mas não o update, conferi os componentes com os do expemplo que funciona e está tudo igual.


GOSTEI 0
Danielrsanches

Danielrsanches

31/05/2009

tente verificar o comando ´update´ ou ´insert´ se este campo específico está incluso ...

abraço !!



GOSTEI 0
Henrique Rodrigues

Henrique Rodrigues

31/05/2009

dmreceitas.ClientDataSet1.insert;
dmreceitas.ClientDataSet1.Post;
dmreceitas.ClientDataSet1.ApplyUpdates(-1); //já tentei -1, 0, 1


Estão aí os comandos que usei, acho que não há nada errdo com eles, mas não sei o que o ocorre.


GOSTEI 0
Danielrsanches

Danielrsanches

31/05/2009

digo o insert do seu clientdataset ... verifique o código SQL para inserir no banco de dados...
o comando ´dmreceitas.ClientDataSet1.insert´ nada mais é do que um comando que executa uma sequencia de comandos SQL ... o mesmo ocorre com o comando ´dmreceitas.ClientDataSet1.post´ ... e é esses comandos SQL que vc tem que verificar ...

espero q tenha entendido algo !! rsrsrsrs

qq coisa é só postar ...

abraço !!


GOSTEI 0
Woinch

Woinch

31/05/2009

Você por acaso não iniciou uma transação e esqueceu de dar Commit?


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

31/05/2009

Colega,

Tem como você colocar a sequência de componentes utilizados e as suas respectivas ligações?

Fiz um teste aqui com Delhi 6 Pro e FB 2.1 e funcionou normalmente:

/*==============================================================*/
/* Table: PEDIDO                                                */
/*==============================================================*/
create table PEDIDO (
PEDI_ID              INTEGER                        not null,
PEDI_ENTREGA         DATE                           not null,
constraint PK_PEDIDO primary key (PEDI_ID)
);


Por crença, utilizei o OnCloseUp:

[code]
procedure TForm1.cds1AfterPost(DataSet: TDataSet);
begin
cds1.ApplyUpdates(0);
end;

procedure TForm1.cds1AfterDelete(DataSet: TDataSet);
begin
cds1.ApplyUpdates(0);
end;

procedure TForm1.dtp1CloseUp(Sender: TObject);
begin
cds1.Append;
cds1PEDI_ID.Value := 1;
cds1PEDI_ENTREGA.Value := dtp1.DateTime;
cds1.Post;
end;
[/code;


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

31/05/2009

Colega,

Tem como você colocar a sequência de componentes utilizados e as suas respectivas ligações?

Fiz um teste aqui com Delhi 6 Pro e FB 2.1 e funcionou normalmente:

/*==============================================================*/
/* Table: PEDIDO                                                */
/*==============================================================*/
create table PEDIDO (
PEDI_ID              INTEGER                        not null,
PEDI_ENTREGA         DATE                           not null,
constraint PK_PEDIDO primary key (PEDI_ID)
);


Por crença, utilizei o OnCloseUp:

[code]
procedure TForm1.cds1AfterPost(DataSet: TDataSet);
begin
cds1.ApplyUpdates(0);
end;

procedure TForm1.cds1AfterDelete(DataSet: TDataSet);
begin
cds1.ApplyUpdates(0);
end;

procedure TForm1.dtp1CloseUp(Sender: TObject);
begin
cds1.Append;
cds1PEDI_ID.Value := 1;
cds1PEDI_ENTREGA.Value := dtp1.DateTime;
cds1.Post;
end;
[/code;


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

31/05/2009

Colega,

Tem como você colocar a sequência de componentes utilizados e as suas respectivas ligações?

Fiz um teste aqui com Delhi 6 Pro e FB 2.1 e funcionou normalmente:

/*==============================================================*/
/* Table: PEDIDO                                                */
/*==============================================================*/
create table PEDIDO (
PEDI_ID              INTEGER                        not null,
PEDI_ENTREGA         DATE                           not null,
constraint PK_PEDIDO primary key (PEDI_ID)
);


Por crença, utilizei o OnCloseUp:

procedure TForm1.cds1AfterPost(DataSet: TDataSet);
begin
  cds1.ApplyUpdates(0);
end;

procedure TForm1.cds1AfterDelete(DataSet: TDataSet);
begin
  cds1.ApplyUpdates(0);
end;

procedure TForm1.dtp1CloseUp(Sender: TObject);
begin
  cds1.Append;
  cds1PEDI_ID.Value := 1;
  cds1PEDI_ENTREGA.Value  := dtp1.DateTime;
  cds1.Post;
end;
;


GOSTEI 0
Henrique Rodrigues

Henrique Rodrigues

31/05/2009

Fiz uma coisa que funcionou.

No SQLDataSet o comando sql coloqueis os campos ao invés de ´*´ e funcionou. mas...


na mesma tabela tem um campos para colocar imagem, aí quando eu insiro um registro sem a imagem ele funciona, se eu colocar a imagem ele não registro no banco.


Usando o componente OpenPictureDialog. Usei um modelo ue tenho aqui

IF OpenPictureDialog1.execute then
   Begin
    imagem:=Tpicture.create();
    imagem.loadfromfile(OpenPictureDialog1.filename);
     clipboard.Assign(imagem);
     DBImage1.PasteFromClipboard;
    imagem.Free;
   end;



GOSTEI 0
Henrique Rodrigues

Henrique Rodrigues

31/05/2009

testei de novo, só a foto que não vai, está estranho, pq a cada momento ele se comporta de uma maneira


GOSTEI 0
Henrique Rodrigues

Henrique Rodrigues

31/05/2009

outra dúvida, nesse mesmo form, que é aberto em showmodal, quando chamo a caixa abrir imagem ela abre atrás do form.


GOSTEI 0
Danielrsanches

Danielrsanches

31/05/2009

IF OpenPictureDialog1.execute then Begin imagem:=Tpicture.create(); imagem.loadfromfile(OpenPictureDialog1.filename); clipboard.Assign(imagem); DBImage1.PasteFromClipboard; imagem.Free; end;


porque vc não carrega direto no dbimage ???

IF OpenPictureDialog1.execute then 
   Begin 
        dbimage1.Picture.LoadFromFile(OpenPictureDialog1.filename); 
   end;


abraços !!!


GOSTEI 0
Henrique Rodrigues

Henrique Rodrigues

31/05/2009

Fiz dessa maneira aí ficou melhor mesmo.

Agora o interessante é o defeito, se eu registrar um novo cadastro sem a foto ele grava no banco, se eu colocar a foto ele não grava.

o Dbimage está ligado da mesma forma que o dbedit do formulário de inclusão.


GOSTEI 0
Danielrsanches

Danielrsanches

31/05/2009

o DBImage está ligado a um campo de qual TIPO na sua tabela ???


GOSTEI 0
Henrique Rodrigues

Henrique Rodrigues

31/05/2009

BLOB, do firebird 2.0


GOSTEI 0
Danielrsanches

Danielrsanches

31/05/2009

vc está tentando salvar uma imagem com qual extensão ??? .BMP ou .JPG ??? até onde eu sei, no banco de dados só é possível salvar imagens tipo .BMP... se não me engano, já vi alguns artigos na net sobre rotinas que transformam a imagem .JPG em .BMP antes de gravar no banco ... dê uma pesquisada no Google a respeito que com certeza vc vai encontrar ....

qq outra dúvida é só postar !!!


abraço !!!


GOSTEI 0
Henrique Rodrigues

Henrique Rodrigues

31/05/2009

então aí é que está, usando o IBExpert, eu consigo salvar a imagem numa boa, e visualizar depois pelo meu programa, só salvar que não funciona


GOSTEI 0
Henrique Rodrigues

Henrique Rodrigues

31/05/2009

begin
IF OpenPictureDialog1.execute then
   Begin
    dbimage1.Picture.LoadFromFile(OpenPictureDialog1.filename);
    clipboard.Assign(DBImage1.picture);
    DBImage1.PasteFromClipboard;
  end;
end;


Estou usando assim.

Em seguida no botão confirmar

begin
  dmreceitas.ClientDataSet1.Post;
  dmreceitas.ClientDataSet1.ApplyUpdates(-1);
  modalresult := -1;
end;


Aí quando volta para o form anterior ele visualiza o que inseri, mas é fechar e abrir de novo, e já era. Se eu fizer o mesmo sem mexer na imagem, só os dados aí ele funciona.


Só falta isso e fazer a caixa de diálogo parar de abrir atrás dessa janela para eu entregar esse programa, estou batendo cabeça a dias em cima disso e não consigo nada.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

31/05/2009

por acaso seu formulário não está com o estilo fsStayOnTop? se estiver, deixe como fsNormal.


GOSTEI 0
Henrique Rodrigues

Henrique Rodrigues

31/05/2009

Foi isso mesmo, valeu, vai ver que mudei quando eu procurava o que está errado quanto a imagem, usei até o navigator e nada. não grava no banco nem a pau


GOSTEI 0
Henrique Rodrigues

Henrique Rodrigues

31/05/2009

Rodando com o F9 está aparecendo isso no LOG

First chance exception at $7C812AEB. Exception class TDBXError with message ´Incorrect values within SQLDA structure´. Process ProjetoReceita.exe (1136)



GOSTEI 0
Emerson Nascimento

Emerson Nascimento

31/05/2009

para gravar pelo dbimage não deveria ser somente
IF OpenPictureDialog1.execute then
    dbimage1.Picture.LoadFromFile(OpenPictureDialog1.filename);
???

isso pra mim é um problema, pois no Delphi 7 e anteriores, fazendo desta forma a gravação SEMPRE será em BMP, não importando se você abriu uma imagem JPG, PNG, GIF ou seja lá qual padrão o dbimage aceitar ler. Ele lê vários, mas só grava BMP (para poder saber como fazer a leitura). pelo menos foi isso que eu consegui avaliar nos meus testes.
Os BMP geralmente ocupam muuuuito mais espaço em disco que um JPG. Mas muitos podem dizer: ´mas hoje a capacidade dos HD é muito grande e o custo é baixo´, etc, etc ... certo. E em conexões remotas, on-line? Um JPG é muito mais fácil de ser transportado.
Por isso há várias rotinas ensinando a transformar a imagem em JPG e gravá-la no banco de dados (porém não será possível usar o dbimage nesse caso, sendo necessário a manipulação de um TImage).

Pra facilitar o trabalho pode ser feito um componente herdado de dbimage que grave e leia JPG ao invés de BMP.


GOSTEI 0
Henrique Rodrigues

Henrique Rodrigues

31/05/2009

usei o código anterior por um exmplo de um livro que tenho aqui, ue no exemplo funciona, mas é só a imagem não vai dados junto. Deixei só como vc me passou mas dá o mesmo problema. será um bug do delphi?


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

31/05/2009

veja se [url=http://forum.devmedia.com.br/viewtopic.php?t=82733&highlight=imagem+firebird]este tópico[/url] te ajuda com a gravação de imagens


GOSTEI 0
Henrique Rodrigues

Henrique Rodrigues

31/05/2009

não ajudou muito não, como meu conhecimento é restrito códigos complexos fica difícil de entender


GOSTEI 0
Henrique Rodrigues

Henrique Rodrigues

31/05/2009

vou tentar os componentes interbase, vou tirar o Dbxpress


GOSTEI 0
POSTAR