Ir para conteúdo
Fórum Script Brasil

Carlos Rocha

Membros
  • Total de itens

    1.300
  • Registro em

  • Última visita

Tudo que Carlos Rocha postou

  1. Isso mesmo. E o interessantes é que os 2 problemas acotecem no modo dsEdit.
  2. Pois é eu fiz isso. 1) Tenho a ídea de, ao clikar no botão gravar, sejam feitas algumas considerações; A - Uma pesquiza usando uma query auxiliar no Form que retornara todos os dados da tabela Clientes onde o Campo cPF_CNPJ seja igual ao preenchido no DBEditCPF_CNPJ.Text. B - Depois verifica o estado da Query principal do Form: Caso seja dsInsert, e caso o CPF ou CNPJ digitado não tenha cadastro na tabela, aí dá um Post e grava. Até aí esta ok. Caso seja dsEdit, e caso o CPF ou CNPJ digitado seja o mesmo do cadastro na tabela, aí dá um Post e grava. Até aí esta ok, depois verifica se o CPF ou CNPJ digitado não seja o mesmo do cadastro na tabela e não tenha cadastro na tabela, aí não Posta e aborta. Aqui está dando erro, está gravando mesmo assim. Esse é o Código que to usando: procedure TCClientes.BitBtnGravarClick(Sender: TObject); begin QryClientes2.Close; QryClientes2.Sql.Clear; QryClientes2.SQL.Add('Select * from Clientes where CPF_CNPJ = '+''''+DBEditCPF_CNPJ.Text+''''+''); QryClientes2.Open; if QryClientes.State in [dsInsert] then begin if not QryClientes2.Eof then //já existe cadastro begin ShowMessage ('Já existe Cadastrado com este CPF/CNPJ. Pesquize!'); Abort; end else begin QryClientes.Post; ShowMessage ('Cadastrado efetuado com sucesso!'); end end else if QryClientes.State in [dsEdit] then begin if QryClientesCPF_CNPJ.Value = DBEditCPF_CNPJ.Text then begin QryClientes.Post; ShowMessage ('Alteração efetuada com sucesso!'); end else begin if not QryClientes2.Eof then //já existe cadastro - Aqui está dando erro, está gravando mesmo assim. begin ShowMessage ('Já existe Cadastrado com este CPF/CNPJ. Pesquize!'); Abort; end end end end; 2) Outra coisa e que eu quero forçar o cara a digitar todos os dígitos do CPF ou CGC. To usando o código abaixo mas quando o cara não digita os digitos todos, ele anula o Post e fica aguardando o cara terminar de digitar pra liberar o Post em vez de dar mensagem, porem isso só esta acontecendo no estado dsEdit da Query. Eu usei o código abaixo mas num funciona com a query no estado dsEdit! procedure TCClientes.QryClientesBeforePost(DataSet: TDataSet); begin if DBRadioGroupTipo.ItemIndex = 0 then begin if (Length(DBEditCPF_CNPJ.Text) <> 11) then begin ShowMessage('CPF tem 11 Dígitos'); DBEditCPF_CNPJ.SetFocus; // posiciona o cursor Abort; // não grava e continua editando end end else begin if (Length(DBEditCPF_CNPJ.Text) <> 14) then begin ShowMessage('CNPJ tem 14 Dígitos'); DBEditCPF_CNPJ.SetFocus; // posiciona o cursor Abort; // não grava e continua editando end end end Iteressantes que os 2 problemas acotecem no modo dsEdit. Da uma força aí pessoal. Oh pessoal. Da uma força ai!
  3. 1) Tenho a ídea de, ao clikar no botão gravar, sejam feitas algumas considerações; A - Uma pesquiza usando uma query auxiliar no Form que retornara todos os dados da tabela Clientes onde o Campo cPF_CNPJ seja igual ao preenchido no DBEditCPF_CNPJ.Text. B - Depois verifica o estado da Query principal do Form: Caso seja dsInsert, e caso o CPF ou CNPJ digitado não tenha cadastro na tabela, aí dá um Post e grava. Até aí esta ok. Caso seja dsEdit, e caso o CPF ou CNPJ digitado seja o mesmo do cadastro na tabela, aí dá um Post e grava. Até aí esta ok, depois verifica se o CPF ou CNPJ digitado não seja o mesmo do cadastro na tabela e não tenha cadastro na tabela, aí não Posta e aborta. Aqui está dando erro, está gravando mesmo assim. Esse é o Código que to usando: procedure TCClientes.BitBtnGravarClick(Sender: TObject); begin QryClientes2.Close; QryClientes2.Sql.Clear; QryClientes2.SQL.Add('Select * from Clientes where CPF_CNPJ = '+''''+DBEditCPF_CNPJ.Text+''''+''); QryClientes2.Open; if QryClientes.State in [dsInsert] then begin if not QryClientes2.Eof then //já existe cadastro begin ShowMessage ('Já existe Cadastrado com este CPF/CNPJ. Pesquize!'); Abort; end else begin QryClientes.Post; ShowMessage ('Cadastrado efetuado com sucesso!'); end end else if QryClientes.State in [dsEdit] then begin if QryClientesCPF_CNPJ.Value = DBEditCPF_CNPJ.Text then begin QryClientes.Post; ShowMessage ('Alteração efetuada com sucesso!'); end else begin if not QryClientes2.Eof then //já existe cadastro - Aqui está dando erro, está gravando mesmo assim. begin ShowMessage ('Já existe Cadastrado com este CPF/CNPJ. Pesquize!'); Abort; end end end end; 2) Outra coisa e que eu quero forçar o cara a digitar todos os dígitos do CPF ou CGC. To usando o código abaixo mas quando o cara não digita os digitos todos, ele anula o Post e fica aguardando o cara terminar de digitar pra liberar o Post em vez de dar mensagem, porem isso só esta acontecendo no estado dsEdit da Query. Eu usei o código abaixo mas num funciona com a query no estado dsEdit! procedure TCClientes.QryClientesBeforePost(DataSet: TDataSet); begin if DBRadioGroupTipo.ItemIndex = 0 then begin if (Length(DBEditCPF_CNPJ.Text) <> 11) then begin ShowMessage('CPF tem 11 Dígitos'); DBEditCPF_CNPJ.SetFocus; // posiciona o cursor Abort; // não grava e continua editando end end else begin if (Length(DBEditCPF_CNPJ.Text) <> 14) then begin ShowMessage('CNPJ tem 14 Dígitos'); DBEditCPF_CNPJ.SetFocus; // posiciona o cursor Abort; // não grava e continua editando end end end Iteressantes que os 2 problemas acotecem no modo dsEdit. Da uma força aí pessoal. Oh pessoal. Da uma força ai!
  4. Estou com o seguinte problema agora: Eu peciso fazer com que num campo "DBEditCPF_CNPJ", a pessoa seja forçada a digitar todos os digitos. Eu usei o código abaixo mas num funciona! if DBRadioGroupTipo.Value = 'F' then begin if DBEditCPF_CNPJ.Tag = 14 then ShowMessage('CPF tem 11 Dígitos'); DBEditCPF_CNPJ.SetFocus; // posiciona o cursor Abort; // não grava e continua editando end else if DBRadioGroupTipo.Value = 'J' then begin if DBEditCPF_CNPJ.tag = 14 then ShowMessage('CNPJ tem 14 Dígitos'); DBEditCPF_CNPJ.SetFocus; // posiciona o cursor Abort; // não grava e continua editando end Outra coisa é o seguinte: Com o código abaixo, eu populo corretamente um DBGrid através de um DBEdit. Porem eu tenho um Edit, uma comobox e um DBGrid O cara digita no Edit o nome ou cpf-cnpj e escolhe na combobox se quer consulta por nome ou CPF_CNPJ Na combobox, tem as opções: 1) Escolha 2) Nome 3) CPF_CNPJ Pra pessoa escolher qual campo da tabela sera usado para pesquisa, se Nome ou CPF_CNPJ. Porem, não existe o campo Escolha, como faço para tratar a mensagem de erro que da quando o cara não escolhe o campo? procedure TPCli.Edit1Change(Sender: TObject); begin QryClientes.Close; QryClientes.SQL.Clear; QryClientes.SQL.Add('select * from Clientes where '+ComboboxEscolha.Text+' like:vardigito order by Nome'); QryClientes.Parambyname('vardigito').asstring:= Edit1.text +'%'; QryClientes.Open; end; Ah! Só mais uma coisa, das 3 orientações anteriores que você me deu, 2 resolveram apenas 1 não deu. Adaptei o código para por mascaras no DBGrid mas está dando erro: procedure TPCli.DBGridDadosDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if Column.Field.FieldName = 'CPF_CNPJ' then // aqui tem que colocar o campo tipo cliente da sua tabela e testar se é física // e estará sendo testada a linha que estiver sendo pintada, então "don't worry" if DBGridDados.DataSource.DataSet.FieldByName('Tipo').Value = 'F' then begin DBGridDados.Canvas.TextOut(Rect.Left+2,Rect.Top, FormatMaskText('999.999.999-99;0;', Column.Field.AsString)); Exit; end else if DBGridDados.DataSource.DataSet.FieldByName('Tipo').Value = 'J' then begin DBGridDados.Canvas.TextOut(Rect.Left+2,Rect.Top, FormatMaskText('999\.999\.999\-99;0;_', Column.Field.AsString)); Exit; end; DefaultDrawColumnCell(Rect, DataCol, Column, State); end; o erro é: Build [Error] PesqCli.pas(121): Undeclared identifier: 'FormatMaskText' [Error] PesqCli.pas(129): Undeclared identifier: 'DefaultDrawColumnCell' [Fatal Error] SaneRio.dpr(14): Could not compile used unit 'PesqCli.pas'
  5. Ola, depois de muito quebrar a cabeça deu pra aprender um pouquinho. Porem dependerei de tirar mais algumas duvidas. 1) O código abaixo esta funcionando correto até o QryClientes.Post; Porem eu gostaria de testar tambem se eu estou editando um registro existente ou postando um novo registro. Onde estara o erro, sendo que a alteração ou inserção é executada corretamente, porem a Mensagem de "Cadastrado com sucesso!" ou "Alteração efetuada com sucesso!", não é exibida? QryClientes2.Close; QryClientes2.Sql.Clear; QryClientes2.SQL.Add('Select * from Clientes where CPF_CNPJ = '+''''+DBEditCPF_CNPJ.Text+''''+''); QryClientes2.Open; if not QryClientes2.Eof then //já existe cadastro begin ShowMessage ('Já existe Cadastrado com este CPF/CNPJ!'); Abort; BitBtnCancelar.Click; BitBtnNovo.Click; end else begin QryClientes.Post; if QryClientes.State in [dsInsert] then begin ShowMessage ('Cadastrado com sucesso!'); end else if QryClientes.State in [dsEdit] then begin ShowMessage ('Alteração efetuada com sucesso!'); end end 2) Outra coisa é o seguinte. Numa tela simples de exibição de cliente num DBGrid à medida que vou digitando o nome, gostaria que fosse filtrando no DBGrid para que a lista fosse dimiuindo até ficar apenas o registro digitado no edit. 3) Só mais uma última coisa: Como fazer para que, neste DBGrid, caso o campo "Tipo de Cliente" retornar "Fisica", como fazer para colocar uma mascara de CPF no campo "CPF_CNPJ" para, neste caso, mascarar o CPF? Obrigado! Carlos Rocha
  6. Carlos Rocha

    Indexação

    Indice Secundario em tabelas no MySql, tem jeito? Aqueles "Secundarie Indices" das tabelas paradox.
  7. alguém sabe onde ficam: 1) A propriedade .FindKey da ZeosTable 2) A propriedade .CancelRange da ZeosTable 3) A propriedade .SetRange da ZeosTable 4) A propriedade .GotoCurrent da ZeosTable Valeu! Table BDE X Table Zeos
  8. Mas num da certo de jeito nenhum. alguém sabe onde ficam: 1) A propriedade .FindKey da ZeosTable 2) A propriedade .CancelRange da ZeosTable 3) A propriedade .SetRange da ZeosTable 4) A propriedade .GotoCurrent da ZeosTable Valeu!
  9. Ola Micheus. Tudo bem? Primeiramente, quero agradecer pela força que você esta me dando. Cada informação que vocês me passam, esta sendo por min muito analizada mas minha pequena(ou quem sabe 'NULA') experiencia, muitas das veses não me ajuda muito. Mas vamos lá. Estou usando Zeos pra conectar o Banco Mysql. Eu tentei usar: if not TableClientes.FindField(TablePedidosNomeCliente.AsString) Pois não tem FindKey na ZTable mas continua dando erro. Preciso da tua ajuda. Aproveitando o ensejo, gostaria de fazer outra pergunta: Minha tabela ZeusTableClientes, ão entra de jeito nenhum em estado de edição e inserção. Pus o código abaixo em um button e a resposta sempre é não. if (ZTableclientes.State in [dsInsert,dsEdit]) then //Verifica se a tabela esta em estado de edição ou inserção begin showmessage('OK'); end else begin showmessage ('Não deu'); end end; Como fazer para passar o estado dela para edição e inserção?
  10. Ola. Obrigado pelas dicas. Diminuiram muito os erros mas ainda tem alguns: Esses já queimei muito neuronio mas nada. Por favor, me continue ajudado que eu vou chegar lá: [Error] CadPedidos.pas(259): Incompatible types: 'String' and 'TField' [Error] CadPedidos.pas(340): Operator not applicable to this operand type [Fatal Error] SaneRio.dpr(15): Could not compile used unit 'CadPedidos.pas' Eis o codigo todo, onde sera que esta o erro: unit CadPedidos; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, DBCtrls, Grids, DBGrids, ExtCtrls, DB, ZAbstractRODataset, ZAbstractDataset, ZAbstractTable, ZDataset, Mask; type TCPedidos = class(TForm) PanelDados: TPanel; PanelBotoes: TPanel; DBGridItens: TDBGrid; DBNavigatorPedidos: TDBNavigator; SpdBtnAlterar: TSpeedButton; SpdBtnIncluir: TSpeedButton; SpdBtnProcurar: TSpeedButton; SpdBtnCancelar: TSpeedButton; SpdBtnGravar: TSpeedButton; SpdBtnExcluir: TSpeedButton; BitBtnFechar: TBitBtn; TablePedidos: TZTable; TableItens: TZTable; TableClientes: TZTable; TableProdutos: TZTable; DSPedidos: TDataSource; DSItens: TDataSource; TablePedidosCodigoPedido: TIntegerField; TablePedidosCondicaoPgto: TStringField; TablePedidosCodigoCliente: TIntegerField; TablePedidosNomeCli: TStringField; TablePedidosLocalFatura: TStringField; TablePedidosLocalCobranca: TStringField; TablePedidosLocalEntrega: TStringField; TablePedidosCPF_CNPJ: TStringField; TablePedidosCEP: TStringField; TablePedidosDataCadastro: TDateField; TableClientesCodigoCliente: TIntegerField; TableClientesNome: TStringField; TableClientesTipo: TStringField; TableClientesEndereco: TStringField; TableClientesEmail: TStringField; TableClientesBairro: TStringField; TableClientesCidade: TStringField; TableClientesEstado: TStringField; TableClientesTelefone: TStringField; TableClientesCPF_CNPJ: TStringField; TableClientesDataCadastro: TDateField; TablePedidosNomeCliente: TStringField; TableProdutosCodigoProduto: TIntegerField; TableProdutosDescricao: TStringField; TableProdutosPrecoUni: TIntegerField; TableItensItem: TIntegerField; TableItensCodigoProduto: TIntegerField; TableItensQuantidade: TIntegerField; TableItensPrecoUni: TIntegerField; TableItensDescricao: TStringField; TableItensTotal: TCurrencyField; TableItensNumeroPedido: TIntegerField; LabelCodigoPedido: TLabel; DBEditCodigoPedido: TDBEdit; LabelCondicaoPagamento: TLabel; DBEditCondicaoPagamento: TDBEdit; LabelCodigoCliente: TLabel; DBEditCodigoCliente: TDBEdit; LabelNomeCliente: TLabel; DBLookupComboBoxNomeCliente: TDBLookupComboBox; LabelLocalFatura: TLabel; DBEditLocalFatura: TDBEdit; LabelLocalCobranca: TLabel; DBEditLocalCobranca: TDBEdit; LabelLocalEntrega: TLabel; DBEditLocalEntrega: TDBEdit; LabelCPF_CNPJ: TLabel; DBEditCPF_CNPJ: TDBEdit; LabelCEP: TLabel; DBEditCEP: TDBEdit; LabelDataCadastro: TLabel; DBEditDataCadastro: TDBEdit; LabelTotalPedido: TLabel; StaticTextTotal: TStaticText; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure TablePedidosNewRecord(DataSet: TDataSet); procedure TableItensCalcFields(DataSet: TDataSet); procedure TableItensNewRecord(DataSet: TDataSet); procedure TableItensBeforeInsert(DataSet: TDataSet); procedure TableItensBeforePost(DataSet: TDataSet); procedure DBGridItensKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure TableItensCodigoProdutoValidate(Sender: TField); procedure TablePedidosDataCadastroSetText(Sender: TField; const Text: String); procedure SpdBtnIncluirClick(Sender: TObject); procedure SpdBtnAlterarClick(Sender: TObject); procedure SpdBtnExcluirClick(Sender: TObject); procedure SpdBtnGravarClick(Sender: TObject); procedure SpdBtnCancelarClick(Sender: TObject); private procedure AtivarControles(Ativar: Boolean); procedure RecalculaPedido; { Private declarations } public { Public declarations } end; var CPedidos: TCPedidos; implementation uses dmsane; {$R *.dfm} procedure TCPedidos.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; // remove o form da memória CPedidos := NIL; // informa que foi destruído (não criado end; procedure TCPedidos.FormCreate(Sender: TObject); begin TableProdutos.Open; TableClientes.Open; TablePedidos.Open; TableItens.Open; end; procedure TCPedidos.FormDestroy(Sender: TObject); begin TableProdutos.Close; TableClientes.Close; TablePedidos.Close; TableItens.Close; end; procedure TCPedidos.TablePedidosNewRecord(DataSet: TDataSet); begin TablePedidosDataCadastro.AsDateTime := Date; //inicia com a data atual end; procedure TCPedidos.AtivarControles(Ativar: Boolean); begin PanelDados.Enabled := Ativar; DBNavigatorPedidos.Enabled := (not Ativar); DBGridItens.ReadOnly := (not Ativar); SpdBtnIncluir.Enabled := (not Ativar); SpdBtnAlterar.Enabled := (not Ativar); SpdBtnExcluir.Enabled := (not Ativar); SpdBtnGravar.Enabled := Ativar; SpdBtnCancelar.Enabled := Ativar; SpdBtnProcurar.Enabled := (not Ativar); end; procedure TCPedidos.RecalculaPedido; var TmpTable:TZTable; Total:Currency; // armazena valores do tipo moeda begin // cria um objeto Table via codificação TmpTable := TZTable.Create(Application); try // define DatabaseName e TableName via codificação TmpTable.Connection := TableItens.Connection; TmpTable.TableName := TableItens.TableName; TmpTable.Open; TmpTable.FindField(TablePedidosCodigoPedido.AsString); Total := 0; // inicializa a variavel totalizadora while (not TmpTable.Eof) and (TmpTable.FieldByName('NumeroPedido').AsInteger = TablePedidosCodigoPedido.AsInteger) do begin // Acumula o Total da linha Total := Total + (TmpTable.FieldByName('PrecoUni').AsCurrency * TmpTable.FieldByName('Quantidade').AsFloat); TmpTable.Next; // próximo registro end; finally TmpTable.Close; // fecha a tabela TmpTable.Free; // libera objeto da memória end; StaticTextTotal.Caption := FormatCurr('###,###,##0.00', Total); end; procedure TCPedidos.TableItensCalcFields(DataSet: TDataSet); begin if (TableItensQuantidade.AsFloat > 0) and (TableItensPrecoUni.AsCurrency > 0) then TableItensTotal.AsCurrency := TableItensPrecoUni.AsCurrency * TableItensQuantidade.AsFloat; RecalculaPedido; // recalcula e exibe novamente end; procedure TCPedidos.TableItensNewRecord(DataSet: TDataSet); begin TableItensQuantidade.AsFloat := 1; DBGridItens.SelectedIndex := 0; //código end; procedure TCPedidos.TableItensBeforeInsert(DataSet: TDataSet); begin if TablePedidosCodigoPedido.AsString = '' then begin if TablePedidos.State = dsInsert then begin // grava para salvar o número do pedido na tabela pai TablePedidos.Post; // ativa a alteração novamente TablePedidos.Edit; end; end; end; procedure TCPedidos.TableItensBeforePost(DataSet: TDataSet); begin if TableItensNumeroPedido.AsString = '' then TableItensNumeroPedido.AsInteger := TablePedidosCodigoPedido.AsInteger; if TableItensCodigoProduto.AsString = '' then begin DBGridItens.SelectedIndex := 0; // seleciona a coluna código ShowMessage('Código do produto deve ser informado!'); Abort; // interrompe a gravação end; if TableItensQuantidade.AsFloat <= 0 then begin DBGridItens.SelectedIndex := 2; // seleciona coluna quantidade ShowMessage('Código do produto deve ser informado!'); Abort; // interrompe a gravação end; end; procedure TCPedidos.DBGridItensKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin // muda para a próxima coluna se pressionar Enter if Key = VK_RETURN then // pressionou ENTER begin case DBGridItens.SelectedIndex of 0: DBGridItens.SelectedIndex := 2; //quantidade 1: DBGridItens.SelectedIndex := 2; //quantidade 2: DBGridItens.SelectedIndex := 3; //preço else DBGridItens.SelectedIndex := 0; //código TableItens.Next; if TableItens.Eof then TableItens.Append; end; end; end; procedure TCPedidos.TableItensCodigoProdutoValidate(Sender: TField); begin if TableItensCodigoProduto.AsString <> '' then begin if TableProdutos.FindField(TableItensCodigoProduto.AsString) <> '' then TableItensPrecoUni.AsCurrency := TableProdutos.FieldByName('PrecoUni').AsCurrency else begin ShowMessage('Código inválido'); Abort; end; end; end; procedure TCPedidos.TablePedidosDataCadastroSetText(Sender: TField; const Text: String); begin if Text = ' / / ' then Sender.Clear // apaga o campo data else // atribui a data digitada ao campo try Sender.AsString := Text; except ShowMessage('Data inválida!'); end; end; procedure TCPedidos.SpdBtnIncluirClick(Sender: TObject); begin AtivarControles(True); // ativa os controles para digitação TablePedidos.Append; // inclui um novo registro na tabela DBEditDataCadastro.SetFocus; end; procedure TCPedidos.SpdBtnAlterarClick(Sender: TObject); begin if TablePedidos.IsEmpty then begin // a tabela está vazia, então devemos incluir SpdBtnIncluir.Click; // executa o click no botão Exit; // retorna end; AtivarControles(True); // ativa os controles para digitação TablePedidos.Edit; // permite alterar os dados DBEditDataCadastro.SetFocus; end; procedure TCPedidos.SpdBtnExcluirClick(Sender: TObject); begin if Application.MessageBox('Deseja excluir este pedido?','Confirme', MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON2) = IDNO then Exit; // retorna (sem fazer nada) // devemos excluir os itens primeiro, para não termos // registros órfãos try TableItens.First; // posiciona no primeiro item while not TableItens.Eof do // executa até o fim do arquivo begin TableItens.Delete; // exclui o item TableItens.First; end; TablePedidos.Delete; // exclui o pedido except ShowMessage('Ocorreu um erro durante a exclusão do pedido'); end; end; procedure TCPedidos.SpdBtnGravarClick(Sender: TObject); begin if TablePedidosCodigoPedido.AsInteger <= 0 then begin ShowMessage('Digite o número do pedido!'); DBEditCodigoPedido.SetFocus; Exit; end; if TablePedidosDataCadastro.IsNull then begin ShowMessage('Digite a data do pedido!'); DBEditDataCadastro.SetFocus; Exit; end; if TablePedidosNomeCliente.AsInteger > 0 then begin // procura pelo cliente usando o código if not TableClientes.FindField(TablePedidosNomeCliente.AsString) = '' then begin ShowMessage('Código de cliente inválido!'); DBEditCodigoCliente.SetFocus; Exit; end; end else begin ShowMessage('Digite o código do cliente!'); DBEditCodigoCliente.SetFocus; Exit; end; TablePedidos.Post; if TableItens.State in [dsInsert,dsEdit] then TableItens.Post; AtivarControles(False); // desativa os controles end; procedure TCPedidos.SpdBtnCancelarClick(Sender: TObject); begin TablePedidos.Cancel; // cancela inclusão/alteração AtivarControles(False); // desativa os controles end; end.
  11. Ola Michael. Num da erro nenhum. Só não grava. vê mais essa então pra min por favor:(Vou acabar conseguindo) To testando um código que encotrei: procedure TCPedidos.RecalculaPedido; var TmpTable:TTable; TmpTable := TTable.Create(Application); Total:Currency; // armazena valores do tipo moeda begin // cria um objeto Table via codificação TmpTable := TTable.Create(Application); try // define DatabaseName e TableName via codificação TmpTable.DatabaseName := TableItens.DatabaseName; TmpTable.TableName := TableItens.TableName; TmpTable.Open; TmpTable.FindKey([TablePedidosCodigoPedido.AsInteger]); Total := 0; // inicializa a variavel totalizadora while (not TmpTable.Eof) and (TmpTable.FieldByName('NumeroPedido').AsInteger = TablePedidosNumeroPedido.AsInteger) do begin // Acumula o Total da linha Total := Total + (TmpTable.FieldByName('preço').AsCurrency * TmpTable.FieldByName('Quantidade').AsFloat); TmpTable.Next; // próximo registro end; finally TmpTable.Close; // fecha a tabela TmpTable.Free; // libera objeto da memória end; StaticTextTotal.Caption := FormatCurr('###,###,##0.00', Total); end; Mas está danda os seguintes erros: Build [Error] CadPedidos.pas(160): ',' or ':' expected but ':=' found [Error] CadPedidos.pas(160): ',' or ':' expected but '(' found [Error] CadPedidos.pas(164): Record, object or class type required [Error] CadPedidos.pas(164): Statement expected, but expression of type 'Enumeration' found [Error] CadPedidos.pas(167): Record, object or class type required [Error] CadPedidos.pas(167): Undeclared identifier: 'DatabaseName' [Error] CadPedidos.pas(168): Record, object or class type required [Error] CadPedidos.pas(169): Record, object or class type required [Error] CadPedidos.pas(170): Record, object or class type required [Error] CadPedidos.pas(172): Record, object or class type required [Error] CadPedidos.pas(176): Record, object or class type required [Error] CadPedidos.pas(176): Missing operator or semicolon [Error] CadPedidos.pas(176): Record, object or class type required [Error] CadPedidos.pas(176): Missing operator or semicolon [Error] CadPedidos.pas(178): EXCEPT or FINALLY expected [Error] CadPedidos.pas(179): 'END' expected but 'FINALLY' found [Error] CadPedidos.pas(183): Declaration expected but identifier 'StaticTextTotal' found [Error] CadPedidos.pas(184): '.' expected but ';' found [Error] CadPedidos.pas(257): Undeclared identifier: 'FindKey' [Error] CadPedidos.pas(338): Undeclared identifier: 'FindKey' [Fatal Error] SaneRio.dpr(15): Could not compile used unit 'CadPedidos.pas' Eis o codigo todo, onde sera que esta o erro: unit CadPedidos; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, DBCtrls, Grids, DBGrids, ExtCtrls, DB, ZAbstractRODataset, ZAbstractDataset, ZAbstractTable, ZDataset, Mask; type TCPedidos = class(TForm) PanelDados: TPanel; PanelBotoes: TPanel; DBGridItens: TDBGrid; DBNavigatorPedidos: TDBNavigator; SpdBtnAlterar: TSpeedButton; SpdBtnIncluir: TSpeedButton; SpdBtnProcurar: TSpeedButton; SpdBtnCancelar: TSpeedButton; SpdBtnGravar: TSpeedButton; SpdBtnExcluir: TSpeedButton; BitBtnFechar: TBitBtn; TablePedidos: TZTable; TableItens: TZTable; TableClientes: TZTable; TableProdutos: TZTable; DSPedidos: TDataSource; DSItens: TDataSource; TablePedidosCodigoPedido: TIntegerField; TablePedidosCondicaoPgto: TStringField; TablePedidosCodigoCliente: TIntegerField; TablePedidosNomeCli: TStringField; TablePedidosLocalFatura: TStringField; TablePedidosLocalCobranca: TStringField; TablePedidosLocalEntrega: TStringField; TablePedidosCPF_CNPJ: TStringField; TablePedidosCEP: TStringField; TablePedidosDataCadastro: TDateField; TableClientesCodigoCliente: TIntegerField; TableClientesNome: TStringField; TableClientesTipo: TStringField; TableClientesEndereco: TStringField; TableClientesEmail: TStringField; TableClientesBairro: TStringField; TableClientesCidade: TStringField; TableClientesEstado: TStringField; TableClientesTelefone: TStringField; TableClientesCPF_CNPJ: TStringField; TableClientesDataCadastro: TDateField; TablePedidosNomeCliente: TStringField; TableProdutosCodigoProduto: TIntegerField; TableProdutosDescricao: TStringField; TableProdutosPrecoUni: TIntegerField; TableItensItem: TIntegerField; TableItensCodigoProduto: TIntegerField; TableItensQuantidade: TIntegerField; TableItensPrecoUni: TIntegerField; TableItensDescricao: TStringField; TableItensTotal: TCurrencyField; TableItensNumeroPedido: TIntegerField; LabelCodigoPedido: TLabel; DBEditCodigoPedido: TDBEdit; LabelCondicaoPagamento: TLabel; DBEditCondicaoPagamento: TDBEdit; LabelCodigoCliente: TLabel; DBEditCodigoCliente: TDBEdit; LabelNomeCliente: TLabel; DBLookupComboBoxNomeCliente: TDBLookupComboBox; LabelLocalFatura: TLabel; DBEditLocalFatura: TDBEdit; LabelLocalCobranca: TLabel; DBEditLocalCobranca: TDBEdit; LabelLocalEntrega: TLabel; DBEditLocalEntrega: TDBEdit; LabelCPF_CNPJ: TLabel; DBEditCPF_CNPJ: TDBEdit; LabelCEP: TLabel; DBEditCEP: TDBEdit; LabelDataCadastro: TLabel; DBEditDataCadastro: TDBEdit; LabelTotalPedido: TLabel; StaticTextTotal: TStaticText; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure TablePedidosNewRecord(DataSet: TDataSet); procedure TableItensCalcFields(DataSet: TDataSet); procedure TableItensNewRecord(DataSet: TDataSet); procedure TableItensBeforeInsert(DataSet: TDataSet); procedure TableItensBeforePost(DataSet: TDataSet); procedure DBGridItensKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure TableItensCodigoProdutoValidate(Sender: TField); procedure TablePedidosDataCadastroSetText(Sender: TField; const Text: String); procedure SpdBtnIncluirClick(Sender: TObject); procedure SpdBtnAlterarClick(Sender: TObject); procedure SpdBtnExcluirClick(Sender: TObject); procedure SpdBtnGravarClick(Sender: TObject); procedure SpdBtnCancelarClick(Sender: TObject); private procedure AtivarControles(Ativar: Boolean); procedure RecalculaPedido; { Private declarations } public { Public declarations } end; var CPedidos: TCPedidos; implementation {$R *.dfm} procedure TCPedidos.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; // remove o form da memória CPedidos := NIL; // informa que foi destruído (não criado end; procedure TCPedidos.FormCreate(Sender: TObject); begin TableProdutos.Open; TableClientes.Open; TablePedidos.Open; TableItens.Open; end; procedure TCPedidos.FormDestroy(Sender: TObject); begin TableProdutos.Close; TableClientes.Close; TablePedidos.Close; TableItens.Close; end; procedure TCPedidos.TablePedidosNewRecord(DataSet: TDataSet); begin TablePedidosDataCadastro.AsDateTime := Date; //inicia com a data atual end; procedure TCPedidos.AtivarControles(Ativar: Boolean); begin PanelDados.Enabled := Ativar; DBNavigatorPedidos.Enabled := (not Ativar); DBGridItens.ReadOnly := (not Ativar); SpdBtnIncluir.Enabled := (not Ativar); SpdBtnAlterar.Enabled := (not Ativar); SpdBtnExcluir.Enabled := (not Ativar); SpdBtnGravar.Enabled := Ativar; SpdBtnCancelar.Enabled := Ativar; SpdBtnProcurar.Enabled := (not Ativar); end; procedure TCPedidos.RecalculaPedido; var TmpTable:TTable; TmpTable := TTable.Create(Application); Total:Currency; // armazena valores do tipo moeda begin // cria um objeto Table via codificação TmpTable := TTable.Create(Application); try // define DatabaseName e TableName via codificação TmpTable.DatabaseName := TableItens.DatabaseName; TmpTable.TableName := TableItens.TableName; TmpTable.Open; TmpTable.FindKey([TablePedidosCodigoPedido.AsInteger]); Total := 0; // inicializa a variavel totalizadora while (not TmpTable.Eof) and (TmpTable.FieldByName('NumeroPedido').AsInteger = TablePedidosNumeroPedido.AsInteger) do begin // Acumula o Total da linha Total := Total + (TmpTable.FieldByName('preço').AsCurrency * TmpTable.FieldByName('Quantidade').AsFloat); TmpTable.Next; // próximo registro end; finally TmpTable.Close; // fecha a tabela TmpTable.Free; // libera objeto da memória end; StaticTextTotal.Caption := FormatCurr('###,###,##0.00', Total); end; procedure TCPedidos.TableItensCalcFields(DataSet: TDataSet); begin if (TableItensQuantidade.AsFloat > 0) and (TableItensPrecoUni.AsCurrency > 0) then TableItensTotal.AsCurrency := TableItensPrecoUni.AsCurrency * TableItensQuantidade.AsFloat; RecalculaPedido; // recalcula e exibe novamente end; procedure TCPedidos.TableItensNewRecord(DataSet: TDataSet); begin TableItensQuantidade.AsFloat := 1; DBGridItens.SelectedIndex := 0; //código end; procedure TCPedidos.TableItensBeforeInsert(DataSet: TDataSet); begin if TablePedidosCodigoPedido.AsString = '' then begin if TablePedidos.State = dsInsert then begin // grava para salvar o número do pedido na tabela pai TablePedidos.Post; // ativa a alteração novamente TablePedidos.Edit; end; end; end; procedure TCPedidos.TableItensBeforePost(DataSet: TDataSet); begin if TableItensNumeroPedido.AsString = '' then TableItensNumeroPedido.AsInteger := TablePedidosCodigoPedido.AsInteger; if TableItensCodigoProduto.AsString = '' then begin DBGridItens.SelectedIndex := 0; // seleciona a coluna código ShowMessage('Código do produto deve ser informado!'); Abort; // interrompe a gravação end; if TableItensQuantidade.AsFloat <= 0 then begin DBGridItens.SelectedIndex := 2; // seleciona coluna quantidade ShowMessage('Código do produto deve ser informado!'); Abort; // interrompe a gravação end; end; procedure TCPedidos.DBGridItensKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin // muda para a próxima coluna se pressionar Enter if Key = VK_RETURN then // pressionou ENTER begin case DBGridItens.SelectedIndex of 0: DBGridItens.SelectedIndex := 2; //quantidade 1: DBGridItens.SelectedIndex := 2; //quantidade 2: DBGridItens.SelectedIndex := 3; //preço else DBGridItens.SelectedIndex := 0; //código TableItens.Next; if TableItens.Eof then TableItens.Append; end; end; end; procedure TCPedidos.TableItensCodigoProdutoValidate(Sender: TField); begin if TableItensCodigoProduto.AsString <> '' then begin if TableProdutos.FindKey([TableItensCodigoProduto.AsInteger]) then TableItensPrecoUni.AsCurrency := TableProdutos.FieldByName('PrecoUni').AsCurrency else begin ShowMessage('Código inválido'); Abort; end; end; end; procedure TCPedidos.TablePedidosDataCadastroSetText(Sender: TField; const Text: String); begin if Text = ' / / ' then Sender.Clear // apaga o campo data else // atribui a data digitada ao campo try Sender.AsString := Text; except ShowMessage('Data inválida!'); end; end; procedure TCPedidos.SpdBtnIncluirClick(Sender: TObject); begin AtivarControles(True); // ativa os controles para digitação TablePedidos.Append; // inclui um novo registro na tabela DBEditDataCadastro.SetFocus; end; procedure TCPedidos.SpdBtnAlterarClick(Sender: TObject); begin if TablePedidos.IsEmpty then begin // a tabela está vazia, então devemos incluir SpdBtnIncluir.Click; // executa o click no botão Exit; // retorna end; AtivarControles(True); // ativa os controles para digitação TablePedidos.Edit; // permite alterar os dados DBEditDataCadastro.SetFocus; end; procedure TCPedidos.SpdBtnExcluirClick(Sender: TObject); begin if Application.MessageBox('Deseja excluir este pedido?','Confirme', MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON2) = IDNO then Exit; // retorna (sem fazer nada) // devemos excluir os itens primeiro, para não termos // registros órfãos try TableItens.First; // posiciona no primeiro item while not TableItens.Eof do // executa até o fim do arquivo begin TableItens.Delete; // exclui o item TableItens.First; end; TablePedidos.Delete; // exclui o pedido except ShowMessage('Ocorreu um erro durante a exclusão do pedido'); end; end; procedure TCPedidos.SpdBtnGravarClick(Sender: TObject); begin if TablePedidosCodigoPedido.AsInteger <= 0 then begin ShowMessage('Digite o número do pedido!'); DBEditCodigoPedido.SetFocus; Exit; end; if TablePedidosDataCadastro.IsNull then begin ShowMessage('Digite a data do pedido!'); DBEditDataCadastro.SetFocus; Exit; end; if TablePedidosNomeCliente.AsInteger > 0 then begin // procura pelo cliente usando o código if not TableClientes.FindKey([TablePedidosNomeCli.AsInteger]) then begin ShowMessage('Código de cliente inválido!'); DBEditCodigoCliente.SetFocus; Exit; end; end else begin ShowMessage('Digite o código do cliente!'); DBEditCodigoCliente.SetFocus; Exit; end; TablePedidos.Post; if TableItens.State in [dsInsert,dsEdit] then TableItens.Post; AtivarControles(False); // desativa os controles end; procedure TCPedidos.SpdBtnCancelarClick(Sender: TObject); begin TablePedidos.Cancel; // cancela inclusão/alteração AtivarControles(False); // desativa os controles end; end. onde sera que esta o erro:
  12. Rapaz, depois de muito mexer acabei decobrindo outro erro que não estou conseguindo descobrir. Quando mando gravar um novo registro no "V" do DBNavigator, a operação não é realizada, em da erro. Porem, se tiver algum registro na tabela para alterar, ele altera normalmente. E agora?
  13. Ok. Ficarei no aguardo. Por enquanto. Muito Obrigado.
  14. Micheus! Quero te agradecer pelo esforço em me ajudar mais o que estou querendo, parece-me ser dar um passo maior que minhas pernas. Sou novo em Delphi e só queria fazer um programinha de cotrole de pedidos que tivesse: 1) Formulario de Cadastro de Clientes; 2) Formulario de Cadastro de Fornecedores; 3) Formulario de Cadastro de Produtos; 4) Formulario de Cadastro de Pedidos; 5) Formulario de Impressao dos Pedidos; Nos Formularios de Cadastro de Clientes e Fornecedores, eu gostaria de fazer aquele squema que ao começar digitar o nome do novo Cliente, autocomplete os dados do cliente já cadastrado para servir de alerta pro Digitadornão correr o risco de cadastrar "Joao José" sendo que "João José" já esta cadastrado. No Formulario de Cadastro de Pedidos, eu queria fazer igual aqueles programinhas de cadastro feito em DOS que a medida que voce digita o nome do produto e da enter, os outros campos, Preço, Descrição são auto preenchidos. Usando Zeos Lib no Delphi 7 com MySql. Tentei muito mas num deu. Mesmo assim quero agradecer pelo boa vontade em ajudar. Caso você teha algum fonte que te ajudou nos teus estudos e possa me passar.......Eu agradeço. Valeu. Carlos Rocha E-mail: carcleo@oi.com.br MSN: carcleo1999@hotmail.com
  15. O que eu quero é popular a combobox com os clientes cadastrados na Tabela Clientes do Banco de Dados. A medida que escolho(troco) o cliente na combobox, os outros campos que tenho que preencher da tabela Cotacoes, sejam automaticamente preenchidos com os dados particulares de cada Cliente escolhido na combobox. Com respeito ao autocompletamento do combobox, é o seguinte: Preciso fazer uma consulta na tabela de clientes de forma tal que, se eu começar a digitar o nome de um cliente cadastrado, ele se auto-complete.
  16. Ola Micheus! Obrigado pela dica. O Conteudo da query é: Select * from clientes order by Nome; E tem um parametro "Nome" O código que estou usando completo é o seguinte procedure TFormCotacoes.ComboBoxCliChange(Sender: TObject); begin if (ZTableCotacoes.State in [dsInsert,dsEdit]) then //Verifica se a tabela esta em estado de edição ou inserção begin ZqryClientes.Close; ZqryClientes.ParamByName('Nome').Value:=ZTableCotacoesNomeCli.Value; ZqryClientes.Open; ZqryClientes.First; //Verifica se encontrou while not ZqryClientes.EOF do begin ComboBoxCli.Items.Add(VarToStr(ZqryClientesNome.Value)); ZqryClientes.Next; end; if not ZqryClientes.IsEmpty then begin ZTableCotacoesCodigo_Cliente.Value:=ZqryClientesId.Value; ZTableCotacoesCodigo_Cliente.Value:=ZqryClientesId.Value; ZTableCotacoesLocal_Cobranca.Value:=ZqryClientesEndereco.Value; ZTableCotacoesCPF.Value:=ZqryClientesCpf.Value; ZTableCotacoesCNPJ.Value:=ZqryClientesCNPJ.Value; end else begin ZTableCotacoesCodigo_Cliente.AsString:=''; ZTableCotacoesLocal_Cobranca.AsString:=''; ZTableCotacoesCPF.AsString:=''; ZTableCotacoesCNPJ.AsString:=''; end end end; essa parte nova é que faz preencher os outros campos(CPF,Tel,Endereço, etc...) Porem, qualquer que seja o Cliente escolhido, só esta dando os dados do 1° cliente cadastrado. E agora????????????
  17. Seria uma coleção com os melhores clipes cristãos que eu tenho. Seri pra evitar a fadiga de ter que pegar varios dvd's, assim ponho os melhores clipes num dvd só e vejo só ele.
  18. Veja só: O código abaixo faz com que a comboboxCli retorne os nomes dos clientes da tabela de clientes. À medida que vou digitando cada letra(tipo C, Ca, Car, Carl, Carlo, Carlos) dos nomes dos clientes, a combobox completa o resto dos nome do cliente. Até aí tudo bem! procedure TFormCotacoes.ComboBoxCliChange(Sender: TObject); begin if (ZTableCotacoes.State in [dsInsert,dsEdit]) then //Verifica se a tabela esta em estado de edição ou inserção begin ZqryClientes.Close; ZqryClientes.ParamByName('Nome').Value:=ZTableCotacoesNomeCli.Value; ZqryClientes.Open; ZqryClientes.Refresh; ZqryClientes.First; //Verifica se encontrou while not ZqryClientes.EOF do begin ComboBoxCli.Items.Add(VarToStr(ZqryClientesNome.Value)); ZqryClientes.Next; end; end end; Agora eu preciso fazer o seguinte: A medida que eu troco o cliente na ComboboxCli, de Carlos para Antonio, os campos CPF, CI, Telefone, etc... mudem tambem de cliente para cliente
  19. Ola pessoal, estou usando Delphi 7, MySql Server e Zeos. Estou com um formulario onde coloquei um ZConnection. Coloquei uma Ztable e conectei bem a tabela. Puxei os itens da tabela pro formulario e puz um DBControl pra as operações mais comuns(postar, alterar). Agora quero fazer o seguinte: Uma vez que já foram cadastrados "n" clientes na tabela, queria que quando abrisse o formulario acotecessem 2 coisas: 1) O formulario viesse vazio e não com os campos do ultimo cadastro preenchido e após cadastrar desse uma mensagem de "Cadastro OK" e depois voltasse o form vazio de novo. 2) Gostaria de, usando os DBEdits colocados o form fazer um sistema de busca. - Por exemplo: são os campos, nome, endereço, cpf...etc... Como fazer para, ao começar digitar o nome de uma pessoa ele autocompletasse o resto do nome e tambem autocompletasse os outros dados que estão na tabela tipo nome, endereço, cpf...etc... Porem, gostaria de fazer isso de forma tal que por exemplo: Ao escrever: Carl Completa o restante do nome carlos ou carla mas tambem quando tivesse completasse carlos e eu tirasse o "os" carl, ele apagasse os dados do carlos pois não existe o cliente "carl" e, apos colocasse "Carla", ele completasse os dados da carla. Me ajudem nessa aí pessoal. Muito Obrigado.
  20. Ola pessoal to precisando de um código para contador de acessos que: 1) Use Access ou não use banco pois o plano de hospedagem que tenho não inclui Banco; 2) Um problemão: Eu quero ter um "Pagina secreta" que receberá o código do contador de acessos porém a página que quero saber quantos acessos teve nela é outra. Tipo assim = A pagina contador.php contem o código mas a pagina que eu quero saber quantas visitas teve é a index.php. Como fazer isso? Desde já agradeço a ajuda. Um grande abraço. Carlos Rocha
  21. É isso mesmo, mas você tem algum exemplo de utilização de linguagem de médio nível (Flash, Java, etc.)
  22. Com o Codigo abaixo, eu envio por ftp um arqivo usando o browser. Eu gostaria d saber como fazer pra enviar todo o conteudo de uma pasta inclusive as pastas dentro dela como fazem os programas de ftp? <? //DADOS PARA CONEXÃO $server = "servidor"; $usuario = "usuario"; $senha = "senha"; //VERIFICA SE O FORM FOI ENVIADO PARA CONECTAR E ENVIAR O ARQUIVO AO FTP if($_POST) { //RECEBE O ARQUIVO $arqName = $_FILES[arquivo][name]; $arqTemp = $_FILES[arquivo][tmp_name]; //CONECTA AO FTP $conn = ftp_connect($server) or die ("ERRO AO CONECTAR AO SERVIDOR DE FTP ".$server); //TENTA EFETUAR O LOGIN COM USUÁRIO E SENHA DE ACESSO if(@ftp_login($conn, $usuario, $senha) ) { //ENVIA O ARQUIVO $status = ftp_put($conn, "/public_html/".$arqName, $arqTemp, FTP_BINARY); //VERIFICA SE O ARQUIVO FOI ENVIADO if($status) { echo "O arquivo $arqName foi enviado com Sucesso!"; }//FECHA IF ( status ) else { echo "Erro! Aconteceu algum problema no envio do arquivo."; }//FECHA ELSE }//FECHA IF (LOGIN) else { echo "Não foi possível efetuar a conexão. Verifique o usuário e a senha de acesso."; }//FECHA ELSE //TERMINA A EXECUÇÃO die; }//FECHA IF ( POST ) ?> <html> <head> <title>Dominando a integração com FTP - Parte 02</title> </head> <body bgstyle="color:#FFFFFF"> <h1>Upload de arquivo - FTP</h1> <form name="frmFtp" method="post" enctype="multipart/form-data"> <table border="0" cellpading="0" cellspacing="0" width="50%"> <tr> <td height="30" width="10%">Arquivo:</td> <td height="30"width="40%"><input name="arquivo" type="file" size="35"></td> </tr> <tr> <td height="30" width="50%" colspan="2"><input type="submit" name="btnEnviar" value="Enviar"></td> </tr> </table> </form> </body> </html>
  23. já consegui fazer isto. É com o programa **CENSURADO** Agora preciso de outra dica: Como criar um novo menu para os clipes que escolhi?
  24. Ola pessoal, minha duvida é a seguinte: Tenho varios DVD's de shows aqui em casa mas tenho preferencia por somente algumas faixas. Como faço para separar apenas as faixas que quero e motar um DVD só com elas? Obrigado. Carlos Rocha
  25. Pessoal, estou com duvidas entre os minitores Monitor SAMSUNG LCD 721S Multimídia 17" MONITOR SAMSUNG LCD 750B PIVOT E DVI 17" Preciso opinioes. Obrigado Carlos
×
×
  • Criar Novo...