
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
Como havia mencionado lá - considero esse assunto encerrado (por favor, não responda a estes comentários - se desejar, atualize sua senha e mande por MP). O que temos que compreender é que quem acessa o forum tem dúvidas, uns mais outros menos. Também, cada um tem suas dificuldades, características e métodos de aprendizado - não dá para julgarmos cada pessoa, comparando-a a nós (não devemos). Se dá, a gente ajuda, se não dá (ou não queremos), então não ajudamos. Não somos todos donos da verdade e de todo o conhecimento - estamos sempre aprendendo. Abraços
-
este parece bem explicativo. Parece que seu campo NUM é do tipo string e não numérico (integer). Sugestão - utilize funções de conversão:CDS_TesteNUM.Value := IntToStr(CDS_Teste.RecNo); este não teria motivo aparente já que o parâmetro é requerido. Veja se após sanar o erro anterior, este ainda persistirá - eventualmente, coisas deste tipo ocorrem. este sempre vai aparecer quando o compilador encontrar um erro na unit.
-
Só para complementar, cabe salientar que se faz necessário que estes filtros estejam disponíveis no QuickReport. Isto pode variar conforme a versão. A versão que acompanha o D6 e D7 (Standard) possui apenas os filtros (componentes a serem adicionados ao form) para exportar TXT (TQRTextFilter), CSV (TQRCSVFilter) e HTML (TQRHTMLFilter). Do site do fabricante QUSoft: "The Standard version of Quick Report 3 is distributed with Delphi 6 and 7 and C++Builder 6 as well as earlier versions of these products." A versão Professional, esta sim, tem vários filtros (ref. QuickReport 4 Product Information): "Output modes - reports may be sent directly to a printer, saved in document format for later viewing, or saved as HTML, PDF, XML, CSV, XL, WMF or ASCII format. HTML and PDF may be streamed for fileless output." HDelphi, esta situação não tenho conhecimento, poderia informar que versão você utiliza e se há algum procedimento para viabilizar este recurso? Ou você tem instalado o plug-in eDocEngine da GNostice (que não acompanha a instalação do Delphi)?
-
o motivo de ter "Query1.cancel;" no evento OnClose, é porque se ele escrever algo nos campos de registro e fechar o form ele cancela o "query1.Append" e não registra nada. Se não tivesse provavelmente daria um erro ao fechar o form, ou na proxima vez que fosse aberta, portanto eu recomendo que ele seja usado. Tudo bem, nunca é demais. Mas, se não me engano, ao fechar o dataset sem gravar os dados (ao utilizar o Post), a edição é automaticamente cancelada - e sem erro (é só testar para conferir). Não fiz qualquer menção ao seu procedimento. O que quiz salientar é que se o 4njo tiver um botão Cancelar, ele deve ter em mente que este é um lugar onde o comando deve ser implementado (vai que ele resolve não chamar no OnClose) - foi só para chamar atenção a sequência de procedimentos (afinal, ele é iniciante - não sei até onde ele já possui conhecimento dos critérios básicos ;)) já tinha conhecimento disto. Eu preferia que requisitasse sim. Afinal, assuntos deste e de outros tipos similares deveria ser tratados por MP! Abraços
-
Está correto sim. Já mencionei isto antes, mas vou colocar aqui também. Sempre que não for citado que componentes estão sendo utilizados, vou me referir a eles pela classe base de todos - TDataSet (do qual todos os componentes de acesso são descendentes). Veja este post Abraços
-
4njo, este foi mais uma observação que esqueci de mensionar. No caso do uso do componente TQuery, a princípio esse dataset é apenas somente leitura (consulta). No uso de alguns bancos, é possível habilitar a propriedade RequestLive de modo que, neste caso, são permitidas alterações no dataset. Então, como você utiliza Paradox, tenha como parâmetro que se vai editar a tabela - utilize um TTable, se vai apenas fazer consultas - utilize um TQuery. Abraços
-
4njo, a idéia é mais ou menos esta que o felipe postou. Apenas algumas observações: 1) Para inclusão de um novo registro, você pode utilizar os métodos Insert ou Append do dataset; 2) O botão cadastro ao qual o colega felipe se refere, só para ficar claro, é aquele em que você programa para executar a gravação dos seus dados (seja um Ok, Gravar, Salvar,...); 3) Eu não recomendaria o ApplyUpdates, a menos que você esteja trabalhando com transações (pouco provável ao utilizar tabelas Paradox), além de que seu uso está associado a propriedade CachedUpdates estar habilitada. Se não for este o caso, simplesmente utilize o método Post do dataset; Só para constar, sobre ApplayUpdates no help: "Call ApplyUpdates to write a dataset’s pending cached updates to a database. This method passes cached data to the database for storage, but the changes are not committed to the database. An application must explicitly call the database component’s Commit method to commit the changes to the database if the write is successful, or call the database’s Rollback method to undo the changes if there is an error." Ou seja, se estiver utilizando cachedupdates, após o ApplyUpdates, ainda terá que ser chamado o método Commit do database, conforme exemplo também no help: procedure ApplyButtonClick(Sender: TObject); begin with CustomerQuery do begin Database1.StartTransaction; try ApplyUpdates; {try to write the updates to the database}; Database1.Commit; {on success, commit the changes}; except Database1.Rollback; {on failure, undo the changes}; raise; {raise the exception to prevent a call to CommitUpdates!} end; CommitUpdates; {on success, clear the cache} end; end; 4) Se você tiver um botão para cancelar o processo (ou seja, desistir do cadastramento), é nele que você implementa o uso do método Cancel do dataset; Abraços
-
felipe, sinceramente, este é o tipo de opinião desnecessária. Seu problema com o robinho, aparentemente veio em função do contato via MSN e, então, deveria ser resolvido "por lá". Você sabe como bloquear um usuário no Messenger? Deve saber. Então, simplesmente o bloqueie. O forum não deve servir para este tipo de atitude, afinal o problema não surgiu aqui. felipe, eu poderia tomar esta afirmação como uma atitude desrespeitosa, mas...Com certeza você tem direito de ter sua opinião. Como usuário também tenho a minha a respeito desta atitude, mas me reservo ao direito de não mencioná-la. Se infligir as regras do forum (mesmo você não sendo um usuário registrado), como moderador, eu tenho o dever de aplicar-lhe as devidas sanções. Então, esteja atento para não tumultuar nosso ambiente. Lembre-se que no forum, uns perguntam e outros respondem - ninguém sabe tudo, ninguém é obrigado a nada. Aproveitando que a leitura deste tópico está "rendendo", fica uma dica de um texto que encontrei há algum tempo - pode ser útil para todos nós - Sabedoria e Inteligência (leiam todos e reflitam - sejamos Sábios) Bom, este assunto morre aqui! evidentemente, sem os ":" este texto não poderá ser convertido corretamente. Voce tem que se preocupar com situações deste tipos, se elas podem ocorrer. Em campos como este, talvez seja mais conveniente utilizar um TMaskEdit ou, se for data-aware (como TDBEdit), então formatar a propriedade EditFormat do campo de seu dataset com a máscara "99:99;;1" (por ex.) para que você tenha a validação mais correta. robinho, se tiver outras dúvidas abra um novo tópico.
-
Pessoal, primeiro de tudo vocês tem que falar na mesma linguagem, senão acho que não se chega a lugar algum. mcsmarmcs diz trabalhar com ADOQuery (paleta ADO) e o felipe comenta exemplificando com os componentes da paleta IB. Tá sujeito a problemas de comunicação. É sempre importante termos as informações o mais corretas possíveis. Já não é fácil tirar dúvidas no "campo da virtualidade", quanto mais se estamos falando linguas diferentes. ;) É por isso que sempre insisto em: - mensagem de erro original (nada de tradução - está sujeito a interpretação); - bando de dados em uso, e; - componentes de acesso utilizados. Abraços
-
felipe, dá uma olhada neste post do Dicas & Tutoriais. O objetivo dele é copiar todas as coluna do DBGrid para a área de transferência, mas você pode adaptar os procedimentos para fazer apenas o que você quer. O conceito básico lá é o mesmo que você precisa: percorrer todos os dados do DBGrid ou percorrer os dados selecionados. Abraços
-
[resolvido] Formatar Campo Da Query - Paradox
pergunta respondeu ao Eder de Micheus em Delphi, Kylix
ATÉ FUNCIONA, mas se estiver adicionado via design-time, senão ele nem deixa compilar. podes dar uma dica? Eder, eu até pensei, mas esqueci de dizer que criando o campo em run-time não tem como você acessá-lo pelo nome. O único meio será através de FieldByName ou outros existentes, mas nunca pelo nome do componente da forma como você exemplificou. Tenha em mente que ao adicionar o campo em design-time, assim como ocorre com qualquer variável declarada, o seu executável terá uma referência a uma posição fixa de memória que foi alocada pelo linkador conforme instrução (seu código). No caso da criação de campos em run-time, esse endereço não era conhecido pelo linkador até este momento, então o seu código não tem uma referência ao mesmo. É certo, apenas, que você alocou uma determinada área de memória (no caso, para uma classe tipo TField) e adicionou esta referência na lista de fields do dataset. Assim, só percorrendo esta lista você irá encontrá-lo. Não sei se me expressei bem, mas é mais ou menos isso que ocorre. Quanto a formatação em run-time, se a implementação utilizar a idéia que propus anteriormente, não há qualquer problema. Observe esta parte do código que postei antes - estou formatando em run-time (via código), não?! Field := TIntegerField.Create(Query1); Field.DataSet := Query1; Field.FieldName := 'CdAssunto'; Field.Name := 'Query1CdAssunto'; Field.DisplayFormat := '0000'; // <== ****Na verdade, neste código há uma "gaffe". :rolleyes: A propriedade DisplayFormat não existe na classe ancestral - TField, logo não irá compilar sem que seja feito um type-cast, ou a menos que ao invés de utilizar um variável do tipo TField eu a tivesse declarado como sendo TIntegerField. Mas, ainda via código, você pode utilizar os métodos de acesso aos fields para setar a propriedade DisplayFormat, por ex.: TIntegerField(Query1.Fields[0]).DisplayFormat := '0.00'; TIntegerField(Query1.FieldByName(CdPasta)).DisplayFormat := '0.00'; Observe apenas, que nem todos os tipos de fields possuem esta propriedade. Apenas o que possuem são: No D3: TDateTimeField e TNumericField; No D7: TAggregateField, TDateTimeField, TNumericField e TSQLTimeStampField; Então, este é mais um ponto a ser levado em conta, pois pode gerar erro de execução caso você faça um type-cast errado. Abraços -
Lucifer, se você quer fazer deste modo porque não está utilizando a propriedade Datasource e DataField, então para obter o campo referente a KeyField que foi selecionado, você utiliza a propriedade KeyValue (DBLookupComboBox1.KeyValue). a idéia seria esta mesma e o inverso também. Mas se esta conversão tem que ser para ontem, porque não utilizar os componentes data-aware (os TDB...) que já tem todo um mecanismo pronto?
-
[resolvido] Formatar Campo Da Query - Paradox
pergunta respondeu ao Eder de Micheus em Delphi, Kylix
pessoal, Fields representa a lista de campos (TField) do dataset e, sendo assim, espera que se adicione um TField (ou uma classe descendente deste). Eder, acho que você vai trilhar "o caminho das pedras" com esta abordagem. Veja bem, não dá para simplesmente "adicionar" o campo pelo nome. Voce tem que adicionar o Field com o mínimo de informação: Tipo, Nome, Dataset e, em alguns casos, Tamanho. Um exemplo para você perceber o quanto a coisa pode se complicar. Em um TQuery contendo o select de n campos de uma tabela, eu não adiciono nenhum em design-time (como você). Então, para que ao abrir a query eu visualize os campos que desejo visualizar no DBGrid, uso o seguinte código: procedure TForm1.btnIncluirCamposClick(Sender: TObject); var Field :TField; begin Query1.Close; Query1.Fields.Clear; Field := TIntegerField.Create(Query1); Field.DataSet := Query1; Field.FieldName := 'CdPasta'; Field.Name := 'Query1CdPasta'; Field := TIntegerField.Create(Query1); Field.DataSet := Query1; Field.FieldName := 'CdAssunto'; Field.Name := 'Query1CdAssunto'; Field.DisplayFormat := '0000'; Field := TStringField.Create(Query1); Field.DataSet := Query1; Field.FieldName := 'DsPasta'; Field.Size := 5; // *** Field.Name := 'Query1DsPasta'; Query1.Open; end; Este seria um dos métodos. Não utilizei Query1.Fields.Add(Field) porque o fato de atribuir Query1 à propriedade DataSet do Field resulta na mesma ação (é uma questão de opção). Observou com pode se tornar complicado adicionar os campos? você vai ter que saber que classe de field irá instanciar (veja no help do TField - há 31 tipos possíveis no D7). Não bastasse isto, se você fala de String, então tem que definir o tamanho do campo (como definido no banco). Acredito que ainda seja mais simples adicionar os campos em design-time e formatá-los ou , então, abrir o dataset primeiro e acessar os fields disponíveis (criados em run-time pelo componente) e modificar as propriedades desejadas. Abraços -
felipe, na sessão Tutoriais & Dicas tem um exemplo do colega Alessandro - Exportar dados de um DBGrid para o Excel O exemplo do colega Jesus faz algo similar, mas criando uma tabela no Word e deve funcionar corretamente. Você teria que seguir o código e ajustar as informações conforme necessita - tipo número de colunas e linhas (no código está: s.tables.add(s.range,linhas,colunas); //cria tabela i linhas, j colunas, você tem que definir os valores) - e daís mover os dados conforme a necessidade. As linhas do seu DBGrid, são na verdade aquelas disponíveis em seu dataset (seja Query ou Table) e as colunas os campos (fields) presentes no DBGrid (nem sempre todos os existentes no dataset). Assim, basta percorrer, para cada linha do dataset, as colunas no DBGrid. Se for apenas para implementar um recurso de Copiar do DBGrid da sua aplicação, para depois "ir" até o Word ou Excel e utilizar a opção Colar, então acho que você pode utilizar este código que postei na seção Tutoriais & Dicas - Adicionando Função Copiar Dados De Um Dbgrid Em Sua Aplicação Abraços
-
Para quem precisar, estou compartilhando aqui duas funções a serem utilizadas para implementação da função Copiar do DBGrid para o ClipBoard, viabilizando a colagem em documentos como Word e Excel (uma delas eu já havia colocado em resposta a um post). Como o texto é formatado com a introdução do caracter de tabulação (#9), torna-se fácil a formatação do documento no Word e até mesmo sua conversão para tabela. São duas as funções: 1) FullDBGridToClipBoard - copia todas as linhas para o clipboard; 2) SelDBGridToClipBoard - copia as linhas selecionadas (neste caso a propriedade Options do DBGrid deve ter dgMultiSelect habilidata) para o clipboard; O parâmetro PastHeader determina se o nome das colunas será ou não exportado. Obs: Faz-se necessário adicionar a unit Clipbrd na cláusula uses da unit aonde o código for colocado. procedure FullDBGridToClipBoard(DBGrid :TDBGrid; PastHeader :Boolean); var StrToCopy :string; Idx, IdxCol :Integer; BookMark, SavedBookMark :TBookMark; begin StrToCopy := ''; if PastHeader then// se for para colar o nome das colunas... begin StrToCopy := DBGrid.Columns[0].Title.Caption; for IdxCol := 1 to DBGrid.Columns.Count -1 do StrToCopy := format('%s'#9'%s', [StrToCopy, DBGrid.Columns[IdxCol].Title.Caption]); StrToCopy := StrToCopy +#13#10; end; with DBGrid.DataSource.DataSet do // utilizaremos o dataset do DBGrid - evidente... begin SavedBookMark := GetBookmark; // salvamos a posição atual do cursor - linha selecionada no DBGrid DisableControls; // evitamos que a movimentação no dataset provoque o scroll do DBGrid First; // posicionamos no primeiro registro do dataset while not EOF do // varremos todas as linhas no DBGrid begin StrToCopy := StrToCopy +DBGrid.Columns[0].Field.AsString; for IdxCol := 1 to DBGrid.Columns.Count -1 do StrToCopy := Format('%s'#9'%s', [StrToCopy, DBGrid.Columns[IdxCol].Field.AsString]); StrToCopy := StrToCopy +#13#10; Next; // processando próxima linha... end; ClipBoard.Clear; // limpamos o ClipBoard ClipBoard.SetTextBuf(PAnsiChar(StrToCopy)); // Copiamos o texto montado para o ClipBoard GotoBookMark(SavedBookMark); // reposicionamos o cursor na linha em que estava antes do processo FreeBookMark(SavedBookMark); // liberamos a memória alocada pelo BookMark EnableControls; end; end; procedure SelDBGridToClipBoard(DBGrid :TDBGrid; PastHeader :Boolean); var StrToCopy :string; Idx, IdxCol :Integer; BookMark, SavedBookMark :TBookMark; begin if DBGrid.SelectedRows.Count = 0 then // só processamos algo se houver linhas selecionadas Exit; StrToCopy := ''; if PastHeader then// se for para colar o nome das colunas... begin StrToCopy := DBGrid.Columns[0].Title.Caption; for IdxCol := 1 to DBGrid.Columns.Count -1 do StrToCopy := format('%s'#9'%s', [StrToCopy, DBGrid.Columns[IdxCol].Title.Caption]); StrToCopy := StrToCopy +#13#10; end; with DBGrid.DataSource.DataSet do // utilizaremos o dataset do DBGrid - evidente... begin SavedBookMark := GetBookmark; // salvamos a posição atual do cursor - linha selecionada no DBGrid DisableControls; // evitamos que a movimentação no dataset provoque o scroll do DBGrid for Idx := 0 to DBGrid.SelectedRows.Count -1 do // percorreremos todas as linhas selecionadas begin GotoBookMark(Pointer(DBGrid.SelectedRows[Idx])); // posicionando na linha a ser exportada StrToCopy := StrToCopy +DBGrid.Columns[0].Field.AsString; for IdxCol := 1 to DBGrid.Columns.Count -1 do StrToCopy := Format('%s'#9'%s', [StrToCopy, DBGrid.Columns[IdxCol].Field.AsString]); StrToCopy := StrToCopy +#13#10; end; ClipBoard.Clear; // limpamos o ClipBoard ClipBoard.SetTextBuf(PAnsiChar(StrToCopy)); // Copiamos o texto montado para o ClipBoard GotoBookMark(SavedBookMark); // reposicionamos o cursor na linha em que estava antes do processo FreeBookMark(SavedBookMark); // liberamos a memória alocada pelo BookMark EnableControls; end; end; Exemplo de utilização no seu Form: procedure TForm1.btnCopyFromDBGridClick(Sender: TObject); begin FullDBGridToClipBoard(DBGrid1, True); // ou SelDBGridToClipBoard(DBGrid1, True); end;
-
[resolvido] Dúvida Sobre Dblookupcombobox1
pergunta respondeu ao Pirambu! de Micheus em Delphi, Kylix
Pirambu!, se o uso de SQL não lhe serve, há ainda outras duas opções:1) Criar um campo calculado (neste post eu já tentei lhe explicar como fazê-lo) no dataset correspondente a propriedade ListSource do seu DBLockupComboBox, onde este campo conterá a concatenação das duas colunas e será ele que você atribuirá à propriedade ListField; 2) Mostrar realmente duas colunas ao selecionar um item na lista. Isto é possível através definição de mais que um campo na propriedade ListField do DBLockupComboBox - basta separar o nome do campo por ";". A largura das colunas é determinada pela propriedade DisplayWidth do campo (esta largura é em caracteres, não pixels). Eu utilizo isto para listar Cidades e UF num cadastro simples. Abraços -
Não esquenta não. Desatenção (não é burrice), acontece a qualquer um. ;)
-
Está sim Renato. Observe a fração do código acima e veja que há uma "," após PAR14 e antes de WHERE - ela não deve existir. Mas observe: não basta que você a retire. Fique atento ao fato que pelo método que você está utilizando para concatenação (utilizando o "+") , ao retirar simplesmente a vírgula, resultara em "colar" PAR14 e WHERE (PAR14WHERE) - o que resultará em outro erro. Assim, quando utilizar esta abordagem, lembre-se de sempre adicionar um espaço no final da linha, tipo: ..."USUARIO=:PAR14 '+" Mas a título de "conselho" para evitar problemas futuros, utilize o método Add ao invés de "+". Por exemplo:DM.CADINS.SQL.Add('UPDATE CADINS SET RAZAO=:PAR1,FANTASIA=:PAR2,CNPJ=:PAR3,'); DM.CADINS.SQL.Add('INSEST=:PAR4,ENDER=:PAR5,COMPLE=:PAR6,BAIRRO=:PAR7,'); DM.CADINS.SQL.Add('CEP=:PAR8,CIDADE=:PAR9,UF=:PAR10,FONE=:PAR11,FAX=:PAR12,'); DM.CADINS.SQL.Add('OBS=:PAR13,USUARIO=:PAR14'); DM.CADINS.SQL.Add('WHERE ID_CADINS ='+ inttostr(cod)); Abraços
-
Não esqueça de informar também que componente de acesso você utiliza. ;) Dê uma olhada neste tutorial e veja se ele pode lhe ajudar - link O "banco" utilizado é Paradox, mas os conceitos de busca e visualização no DBGrid podem ser utilizados.
-
não parace ser um conteúdo da propriedade Expression. Em todos os casos, com relação ao valor, se é que vem desta consulta, o problema não estaria na origem do campo, ou seja, voce utiliza V.Vl_Venda (vem da tabela Vendas) enquanto parece que deveria vir da tabela Produtos (valor unitário - não sei o nome do campo)? Ou por outro lado, o campo Vl_Venda não seria o nome do campo que contém o total vendido? Não dá para adivinha o que é este errado. Se o erro for pelo mesmo motivo anterior, poderia ser devido ao campo utilizado. Mas, também, pode ser um erro pela existência de um valor nulo nos campos utilizados.
-
Pirambu!, isto é basicamente o que o colega HDelphi propôs inicialmente. Lembrando também, que aparentemente ele já possui um campo para isso. Porém, para seu código funcionar, está faltando colocar a tabela em modo edição (Table.Edit) antes da atribuição e postar os dados após a alteração (Table.Post). Nisto tudo, cabe perguntar ao colega vms se este campo, o tal Numero, pode realmente ser alterado a "bel prazer". Observem, que se este campo for utilizado simplesmente para uma "ordenação visual" (no DBGrid), então não há qualquer problema com as abordagens propostas. Mas, se ao contrário, este campo tiver a finalidade de servir de referência, sendo utilizado por outras tabelas para se referir a respectiva Paravra, então a alteração deste campo é uma ação crítica e incorreta! Só mais uma observação. O colega vms, não citou que componente utiliza para acessar os dados, então, eventualmente este pode ser um item a conhecer: Sobre RecNo no help do Delphi => "This function returns -1 in all cases. Ordinarily an application will not access RecNo at the TDataSet level. Instead a redeclared and implemented RecNo property in a descendant object such as TTable is accessed. RecNo provides a fallback property for derived dataset objects that do not reimplement it." Donde resulta que, em alguns componentes de acesso aos dados, eventualmente, a propriedade RecNo não retorna o número esperado, mas sim -1. Os componentes TTable e TQuery retornam corretamente. Abraços
-
felipe, sem conhecer a estrutura e relacionamento das tabelas está difícil. Tem como você colocar estas informações aqui? Seja como imagem ou digitado mesmo (pelo menos os campos principais de relacionamentos). Aparentemente, está faltando mais alguma ligação da tabela Feeders com as demais. Isto faz com que o relacionamento atual (que você colocou no SQL) satisfaça a todas as condições (para todos os headers) e, então, sejam repetidas.
-
[duvida] Como Inserir Uma Skin Numa Aplicação Delphi?
pergunta respondeu ao roberto_br de Micheus em Delphi, Kylix
A dica do colega Valdomiro é para o uso do componente VCLSkin (observar que este componente não é freeware).Se você está utilizando o componente do link que você postou, então sugiro que você acesse a página de download do desenvolvedor (em http://www.almdev.com/) e baixe os demos que lá estão disponíveis (procure por "Samples ..."). -
não entendi essa parte Felipe, talvez seja porque QRGroup e expression existem no QuickReport e não no Report Builder ao qual se refere sua questão.
-
Vagner, este erro ocorre porque no datamodule, não é incluído automaticamente na cláusula Uses a unit Forms - A variável Application está definida lá. Quando você trabalha com arquivos ".ini" em um form não tem este problema porque automaticamente a adição é feita. Abraços.