Pesquisa

15/12/2008

Bom tenho 3 probleminhas eu acho que é simples porem to meio perdido, primeiro eu preciso fazer uma pesquisa de produtos e retornar os valores num dbedit de outra tela de cadastro de itens bom eu fiz assim       procedure Tpesquisaprodutos.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
  inherited;
if key = #13 then
begin
idescricao:=deasy.CdsProdutos.FieldByName(nome).asstring;
icodigo:=deasy.CdsProdutos.FieldByName(barras).asstring;
cadastronotas.dbedit12.text:= idescricao;
cadastronotas.dbedit22.text:= icodigo; close; end;
end;     criei duas variaveis globais pra armazenar o valor do campo quando eu teclo enter ela deveria armazenar o valor do campo, mais nao armazena fika em branco, quando teclo o enter fika em branco na outra tela se eu deixar ativado r o clientdataset ela so me traz o primeiro registro pelo menos foi o que pareceu, nao ta me trazendo o registro q eu to selecionado no dbgrid   duvida 2 como eu faço pra calcular um valor x na tela de cadastro de um pedido pro exemplo, eu digito  a quantidade  depois coloco o valor unitario no campo valor total ele me retornar o valor total da quantidade * valor unitario, pra eu gravar esse valor total no banco de dados.     duvida 3 preciso criar um campo na minha tabela que conte os itens tipo eu insiro um iten ele me mostra iten 1 eu insiro outro iten ele me mostra 2 e que tb eu possa gravar esses valores desses itens no banco de dados.
Paulo Silva

Paulo Silva

Curtidas 0

Respostas

Wesley Yamazack

Wesley Yamazack

15/12/2008

Paulo,

Boa tarde

Vamos lá :

Pergunta 1===============================================================

Pelo que entendi, você esta dizendo que o valor volta em branco, uma duvida, estas variáveis globais estão em que formulário ?   1 - Se estiverem no Form onde você seleciona o item e da o enter, acho que não iria funcionar, elas deveriam estar no formulário que você chama esta telinha de seleção.   2 – Se estiver no Form que você chama a tela de seleção, observe se em algum lugar você não esta limpando estas variáveis. Para fazer a prova dos 9, faça o seguinte.   procedure Tpesquisaprodutos.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
  inherited;
if key = #13 then
begin
idescricao:=deasy.CdsProdutos.FieldByName(nome).asstring;
icodigo:=deasy.CdsProdutos.FieldByName(barras).asstring;
cadastronotas.dbedit12.text:= idescricao;
cadastronotas.dbedit22.text:= icodigo; showmessage(‘Descricao : ’ + idescricao + ‘  Codigo : ’ + icodigo); //obs se estas variáveis forem inteiras tem de converter para + inttostr(Idescricao) e o mesmo //para icodigo; close; end;
end;
Pergunta 2===============================================================
Você pode fazer de várias maneiras,duas delas : 1 – Criar 3 variaveis [ qnt : Integer; PrecoUnit, PrecoTotal : Real ]      PrecoTotal := qnt * PrecoUnit;      Na hora de inserir os dados na tabela, você faz assim:       deasy.CdsProdutos.FieldByName(precototal).asstring := FloatToStr(PrecoTotal);   2 – Você não precisaria gravar o Total da venda, basta gravar a quantidade e o PrecoUnitario. E a qualquer momento que você queira saber qual é o total daquela venda, faça o seguinte:     PrecoTotal:=StrtoFloat(CdsProdutos.FieldByName(quantidade).asstring) * StrtoFloat(CdsProdutos.FieldByName(PretoUnit).asstring);
Pergunta3 ===============================================================
Aqui você pode criar o campo como ‘AutoIncremento’, ele será incrementado toda vez que você executar um deasy.CdsProdutos.Insert, ele irá automaticamente incluir um valor para este campo, seguindo uma ordem, onde este numero nunca se repete, e caso você apague algum item, já mais outro item terá aquele código apagado.
Att,
Wesley Yamazack


GOSTEI 0
Paulo Silva

Paulo Silva

15/12/2008

pois e nao deu certo continua sem armazenar so armazena quando eu vou no cdsprodutos e ativo ele pra true sendo q so me retorna o primeiro registro independente de qual eu esteja selecionado, outra coisa conferi eu declarei a variavel global na nota var
  cadastronotas: Tcadastronotas;
  iunidade, icodigo, idescricao: string; implementation
uses upesprodutos;
{$R *.dfm}     procedure Tcadastronotas.btnpesqClick(Sender: TObject);
begin
  inherited;
  try
  pesquisaprodutos:=Tpesquisaprodutos.Create(self);
  pesquisaprodutos.ShowModal;
  finally
  pesquisaprodutos.Free;
  end;
end;     eu preciso gravar o numero do iten que é a minha terceira duvida sendo que quando eu cadastro uma nova nota esse numero começa a recontar de novo sabe tipo item 1,2,3 etc cada nota tem seus itens todos se iniciando do valor 1 eu preciso que esses itens estajam no banco de dados estou usando firebird 2.1 mais nao consegui imaginar uma maneira de mandar esses numeros sem ter q eu prencher tipo campo numero do item eu fika prenchendo la 1 depois no proximo lançamento eu coloco 2 sabe pra evitar esse desgaste aehuhueheuae.
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

15/12/2008

Bom vamos lá,
Ao inves de pegar o FieldByName do clientdataset, tenta pegar assim :  DataSource1.DataSet.FieldByName(‘Campo’).AsString;   O que eu tinha colocado anteriormente não adiantou não ? Se possível explicar um pouco mais a duvida. Pergunta3 ===============================================================Aqui você pode criar o campo como ‘AutoIncremento’, ele será incrementado toda vez que você executar um deasy.CdsProdutos.Insert, ele irá automaticamente incluir um valor para este campo, seguindo uma ordem, onde este numero nunca se repete, e caso você apague algum item, já mais outro item terá aquele código apagado.
GOSTEI 0
Paulo Silva

Paulo Silva

15/12/2008

bom dia wesley agora pegou o valor sim, o campo que eu preciso que tenha o numero do item ele e uma coluna no banco de dados q identificam a ordem do registro esse campo pode se repetir tipo se eu cadastro uma nota onde ela tem o 3 itens  iten 1,2,3 quando cadastro uma outra nota ele reconta do 1 denovo talvez eu tenha entendido errado tb a sua resposta O.o
 
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

15/12/2008

Paulo,

  Vamos lá, alguns problemas foram resolvidos, agora o seu problema é com relação a nota.

  Pelo que entendi, você tem uma nota fiscal onde ela tem um código único.
  A nota ela pode ter vários itens[1,2,3,4] - Cadastrados em uma tabela produtos por exemplo.
  Na tabela dos itens da nota, você irá precisar ter o código dos produtos, e o código da nota que aqueles produtos pertencem.
  Não sei se seria isso o que você esta querendo. Se tiver como você esmiuçar mais o seu problema.

Att,

Wesley Yamazack
GOSTEI 0
Paulo Silva

Paulo Silva

15/12/2008

bom dia wesley consegui resolver o problema do campo da seguinte maneira agora so pra complementar qual é a maneira mais eficaz de se adicionar um registro num dataset usando objeto do tipo edit ou maskedit?     procedure TDEASY.CDSITENDETALHENewRecord(DataSet: TDataSet);
begin
cdsitendetalheNUMEROITEN.AsInteger :=
cdsitendetalhe.RecordCount+1;
end;
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

15/12/2008

Paulo,

 Use o Edit.

 Coloque o seguinte código no evento onkeypress do seu edit:

procedure TFrmPadrao.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 if not (key in [ 0..9, #8, #13]) then
 Key := #0;
end;

Para que ele so consiga digitar numeros no edit. Restringindo a digitação e assim evitando que ele digite letras ou caracteres especiais.

Att,

Wesley Yamazack
GOSTEI 0
Paulo Silva

Paulo Silva

15/12/2008

qual a maneira correta de inserir esses dados dos edit na tabela ?  
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

15/12/2008

Coloque um botão e no evento onclick do mesmo.


Var
  vUltimoCodigo : Integer;

begin
  //teu CDS ordene ele por código
  cds.last; //vai para o ultimo registro.
  vUltimoCodigo := cds.FieldByName(Codigo).asinteger + 1;
  cds.insert;
    // passe os dados do clientdataset(descricao, qnt, etc)
    cds.FieldByName(Codigo).asinteger := vUltimoCodigo ;
  cds.post;

end;

GOSTEI 0
Paulo Silva

Paulo Silva

15/12/2008

Wesley bom ja consegui fazer quase tudo que eu queria so que agora quando eu busco os registro de descricao dos produtos e codigo eles aparecem la nos dbedit certim so que se eu for prencher qualquer outro campo na tabela eles somem O.o e se eu clicar neles tb, nesse caso eu teria q colocar um edit normal? e inserir os dados na tabela? ou qual procedimento devo eu tomar?
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

15/12/2008

Isso é normal mesmo acontecer.

  Usa edit para ficar mais fácil, sacou ? Fica mais facil de controlar. Dá mais trabalho porém é mais confiável.
  Só não esquece depois de der um post no clientdataset :
  edt1.clear;
  edt2.clear;

  Garantindo assim que ele nunca irá pegar lixo de registros anteriores. sacou ?

Att,

Wesley Yamazack
GOSTEI 0
Paulo Silva

Paulo Silva

15/12/2008

boa noite wesley o problema é o seguinte eu tenho um botao btninserir que executa ds.dataset.insert e tenho tb um botao pra dar salvar que executa ds.dataset.applyupdates[0];  bom quando eu coloco o codigo que vc me disse ele faz assim     ds.dataset.insert; DS.DataSet.FieldByName(SITUACAO).AsString:=ComboBox2.TEXT;
DS.DataSet.FieldByName(EMISSORDOCUMENTO).AsString:=ComboBox1.TEXT; ds.dataset.post;     dessa forma o registro e gravado mais é gravado com o texto que estiver quando eu dou o insert e vou pra alterar colocar outro valor o registro vai pro banco de dados com o valor q estiver atualmente tipo se eu deixar combobox2.text vai esse valor pro bd automaticamente apos o insert se eu inserir no botao gravar esse valor, ele cria uma outra linha no bd bom como soluciono isso e depois como eu faço pra exibir esses registros ja gravado no form denovo tipo consulto ele no form mais ele nao me retorna o valor do combobox O.o fika vazio.       sei que  ja estou enchendo o sako mais tenho essa duvida ae O.o
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

15/12/2008

Boa noite,


Vamos lá. você pode fazer o seguinte.

if ((combobox1.ItemIndex > -1) and (Combobox2.ItemIndex > -1)) then
begin
   ds.dataset.insert;    DS.DataSet.FieldByName(SITUACAO).AsString:=ComboBox2.TEXT;
   DS.DataSet.FieldByName(EMISSORDOCUMENTO).AsString:=ComboBox1.TEXT;    ds.dataset.post;
   combobox1.ItemIndex := -1;
   combobox2.ItemIndex := -1;
   cds.active := false;
   cds.active := True;
end
else
begin
  showmessage(Dados nao informados);
  combobox1.setfocus;
end;


E com relação a esta pertubando, nao esquenta com isso não, estou aqui para te ajudar em tudo que precisar, fica tranquilo com relação a isso.

Abraço..

Wesley
GOSTEI 0
Paulo Silva

Paulo Silva

15/12/2008

suponhamos que eu tenha um form de cadastro de cliente e que nele tenha os campos nome, endereço, cidade e que eu tenha 3 dbedit que armazena os mesmos se eu usar 2combobox normal no momento que eu clico no meu botaozinho insert os dados do combobox vao pra tabela e meus dbedit entra em insert mode certo pois é eu tb tenho um outro botao que executa o ds.dataset.applyupdate que tem o nome de salvar o problema e que quando eu consulto esses mesmos dados num dbgrid ele me mostra os dados inseridos quando eu uso um botao vizualizar q vai pra tabela onde mostra os dados os dados do combobox estao vazios nao estao os dados que eu gravei na mesma tabela tentei fazer assim funciona desse jeito mais quando eu entro na tabela ela fika em insert mode eternamente O.o so sai quando eu clico no botao cancelar(ds.dataset.cancel)     procedure Tcadastronotas.ds2DataChange(Sender: TObject; Field: TField);
begin
  inherited;   ComboBox2.TEXT:= DS.DataSet.FieldByName(SITUACAO).asstring;
ComboBox1.TEXT:=DS.DataSet.FieldByName(EMISSORDOCUMENTO).asstring;   end;       no evento procedure Tcadastronotas.ds2UpdateData(Sender: TObject);
begin
  inherited;      DS.DataSet.FieldByName(SITUACAO).AsString:=ComboBox2.TEXT;
DS.DataSet.FieldByName(EMISSORDOCUMENTO).AsString:=ComboBox1.TEXT;
end;   entao ele da o update certinho das informaçoes que estao na tabela quando eu clico no botao salvar mais quando eu vizualizo os dados nao vem igual em um dbedit sabe?
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

15/12/2008

Paulo, ficou meio complexo, de entender.      Uma coisa, você esta manipulando as tabelas com os mesmos componentes ? Ex. você tem 2 CDS, um esta apontado para a grid e o outro esta controlando os combobox ? Se tiver usando isso, na hora que for gravar, os dados você precisa dar um refresh no outro cds para que ele possa ser atualizado.     Se não for isso, tem como me mandar teu fonte para eu analisar melhor ?     Att,   Wesley Yamazack
GOSTEI 0
Paulo Silva

Paulo Silva

15/12/2008

Wesley o problema nao e inserir o registro pq isso eu consigo fazer tranquilamente o problema e consultar o registro tipo eu clico na dbgrid vai estar os valores eu criei um botao chamado vizualizar esse visualizar sai da grid e entra na tabela ou seja la vai estar todos os registros da grid que eu estava selecionado certo? so que os registros que eu gravei usando o combobox nao vao estar esse e o problema sabe? tem alguma outra forma de fazer isso  tipo quando eu clico em visualisar ele me mostra todos os registros nos campos da tabela sabe tipo nome no campo nome endereço no campo endereço so que o registro que eu inseri usando o combobox nao vai estar la ou os que eu usei os edit mesmo!
GOSTEI 0
Paulo Silva

Paulo Silva

15/12/2008

Esqueci de mencionar wesley estou usando dois cds um que é o master e o outro que é o detalhe eu estou tendo esse problema com o detalhe onde eu coloco os itens, eu coloquei os dbedit + os edit em cima e um dbgrid logo abaixo pra pegar os valores digitados acima.   na tabela master eu fiz assim
procedure Tcadastronotas.DsDataChange(Sender: TObject; Field: TField);
begin
  inherited;
ComboBox2.TEXT:=dS.DataSet.FieldByName(SITUACAO).AsString;
ComboBox1.TEXT:=DS.DataSet.FieldByName(EMISSORDOCUMENTO).AsString;
end;
procedure Tcadastronotas.DsUpdateData(Sender: TObject);
begin
  inherited;
dS.DataSet.FieldByName(SITUACAO).AsString:=  ComboBox2.TEXT;
DS.DataSet.FieldByName(EMISSORDOCUMENTO).AsString:=ComboBox1.TEXT;
end;   funciona perfeitamente
quando eu do apply update ela pega os valores do combobox e quando eu seleciono o registro na dbgrid esses registros sao retornados nos combobox   ja no detalhe nao consigo fazer pq quando eu uso esse codigo ae substituindo os combobox pelos edit que eu quero ao passar pra um outro campo pro exemplo acontece que os meus edits ficam com o conteudo zerado O.o
que coisa sabe? tipo aquela busca eu pus pra retorna nesses mesmos edits descricao e codigo quando eu prencho qulquer outro campo ele zera o conteudo do mesmo.   tentei postar uma foto mais ela e de 50k e so aceita 25k aki mais e isso ae!
 
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

15/12/2008

Boa noite,


   Procura um ftp, eu uso http://www.4shared.com/, ele é muito bom, lá você pode anexar varios arquivo  e é free, isso vai ajudar nestas situações.

   Observa se na hora que você troca os combos por edits, você não esta esquecendo de trocar o nome do CDS tbm, ou D.S., as vezes estas pegadinhas nos pegam, tenta ver o lance do fdtp, e se tu não consegui me manda teu fonte, para resolvermos esta pendencia.

Abraço

Wesley Yamazack


GOSTEI 0
Paulo Silva

Paulo Silva

15/12/2008

Bom wesley ja pode fechar o chamado meu problema ja ta resolvido muitissimo obrigado suas dicas foram de grande valor.     resolvi meu problema dessa maneira     procedure Tcadastronotas.ds2DataChange(Sender: TObject; Field: TField);
begin
  if ds.DataSet.State in [dsinsert, dsedit] then
  begin
  edit3.Text:=ds2.dataset.FieldByName(barras).AsString;
 edit4.text:=ds2.dataset.FieldByName(descricao).asstring;
 edit2.text:=ds2.dataset.FieldByName(un).asstring; end   end     dessa forma meus edit se comportam como se fossem dbedit eu posso trazer os dados neles apenas selecionando o registro e me garantindo quando a tabela estiver em state browse ela nao fique em edit pq c eu n usasse o if ela ia ficar em insert mode eternamente obrigado  
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

15/12/2008

Paulo, boa noite.

   Boaaa !!!  Show de bola, parabéns, que bom que pudemos te ajudar. Aguardo em um proximo chamado..

Abraço

Wesley Yamazack
GOSTEI 0
POSTAR