
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
Deville, é impressão minha ou a dúvida agora é apenas: por que o rollback não funciona? Que banco de dados você utiliza? Lá na tal função que você colocou parte, o que é aquele Next? Não estaria faltando também um Post, para que a cada dependente default inserido o mesmo seja gravado? Abraços
-
kartter, parece-me que este procedimento altera a impressora padrão do Windows, ou seja, para todos os aplicativos. Se o jo_user, quiser mudar apenas a do QuickReport, o caminho é um pouco diferente. Para ele a "informação" está em QRPrinter (se não me engano) Abraços
-
Alessandro, você move a data do componente para seu campo do banco de dados na mão, ou o componente é data-aware e está ligado diretamente ao dataset? Se não me engano o MySQL recebe a data string no formato yyyy-mm-dd
-
Wagner, já que a opção do colega Recife não lhe atende, então a sugestão é que você mude o campo para integer e faça a auto-numeração na mão (select MAX(codigo) from ...). Se você testar no seu código quantas colunas seu recorset retorna: if r.Fields.Count > 0 then s:=r.Fields['codigo'].Value; vai verificar que o erro não ocorre mais. Isto porque INSERT (DELETE, UPDATE) é uma instrução SQL que não retorna resultados (como o SELECT). No help do componente ADOConnection, método Execute, está escrito assim na descrição: Execute returns a recordset if the command executed is one that generates a recordset. Se você alterar sua instrução para um SELECT provavelmente conseguirá acessar os dados como imaginado. Dê uma confirmada nisto. Abraços
-
Thread via API do Windows: Threads (Delphi) (ref. Fera da Informática)Thread via classe TThread: Usando Threads – Parte I; Usando Threads – Parte Final Artigo interessante: Evitando conflitos em aplicações multi-thread no Delphi/Kylix (ref. Artigo UNEB)
-
Tenho mais uma idéia sim :D Se não for problema para você, mantenha o código que passei e habilite a "bendita" da propriedade TabStop que está desabilitada por padrão neste componente. (é que aquele tipo de procedimento só funciona se outro componente recebe o foco) Abraços
-
darth_ivan, faz tempo que não mexo com C, e este conceito nem existia ainda :rolleyes:. Mas olhando o exemplo do link que postei outros que encontrei, fiquei com impressão de que as classes ou funções Friends devem estar declaradas no mesmo escopo (unit do delphi). Isto confere? Porque se isto for verdade, podemos dizer que o conceito existe no Delphi, já que dentro de uma mesma unit, as sessões Protected e Private estão "visíveis" o que viabiliza que o conceito seja aplicado. Neste caso a conversão é "direta", veja como ficariam os exemplos daquele link. Friend Functions: Friend Classes: Obs: os códigos em cinza escuro foram adicionados no corpo do programa, já que no C eles estão dentro da definição da classe (no Delphi isto não é possível) Dê um retorno para sabermos se seria isto ou não. Abraços
-
realmente, "hackear" com esta finalidade não tem um bom resultado. Se você utiliza este DBGrid apenas para visualição (nada de edição), você poderia definir dgRowSelect = True na propriedade Options. Daí este efeito desaparece ao utilizar a técnica mencionada. Do contrário, é tentar encontra na net um componente que permita fixar colunas (sem efeito colateral). Abraços
-
Deville, você tem que gravar o Cliente primeiro, para obter o código chave (acho que você utiliza AutoIncrement). Após o Post do cliente, você terá o campo chave que deverá ser atribuído ao respectivo campo na tabela Dependentes, utilizando o evento OnNewRecord. Algo mais ou menos assim: procedure TForm1.TabDependentesNewRecord(Objects :TDataSet); begin TabDependentesCodCliente.Value := TabClienteCodCliente.Value; end; ao criar um novo dependente (OnNewRecord), pressupõe-se que será para o cliente atualmente selecionado (atual registro na tabela clientes). Abraços
-
jo_user, normalmente o quick utiliza a impressora padrão.No preview você pode alterar a impressora destino através do botão de configuração da impressão. Se for para alterar a impressora programaticamente, também dá. O que você quer realmente?
-
Eder, conferindo... Sua query3 está deste jeito agora? With Query3 Do Begin Close; With SQL Do Begin Clear; Add('Select MAX(CODITEM) From IVISBLU where CODIGO = :CODIGO'); end; ParamByName('CODVISITA').AsFloat := Table1Codigo.Value; Open; Table2CODITEM.Value := Query3CodITEM.AsInteger +1; end; Em que linha o erro está ocorrendo? No momento do Open ou na atribuição "Table2CODITEM.Value := Query3CodITEM.AsInteger +1;"? Pela mensagem é como se você (ou o componente internamente) estivesse utilizando alguma formatação de campo. Esse "%s" é usado com a função Format, e aparentemente em algum momento esta conversão parece estar sendo feita, porêm não estaria sendo informado um dos parâmetros esperados (neste caso uma string).
-
eu acho que deste jeito a linha "1 25/07 sim" será listada, e isso não deve acontecer procurar com entrega like "Sim" ou entrega = "sim", não tem como obter uma linha em que este campo (entrega) seja nulo - se é a isto que você se refere. na verdade, o ideal neste caso em que o campo tem a função de um flag/status, é que ele não seja nulo nunca. Se não é "sim", deveria conter "não" ou "não". É só inicializar o campo no evento OnNewRecord com o valor padrão.Pode evitar muitas dores de cabeças. Abraços
-
essa é difícil.você já tentou usar a depuração, aquele lance do break-point que tentei lhe explicar como usar em outro post? O lance é você conferir se não está passando alguma informação de tipo diferente do esperado para seu banco. Vê lá se você não está tentando colocar um valor float em um campo integer ou coisa parecida.
-
Pirambu!, apenas completando sua sugestão:- observar que o colega armazena o texto "sim" em minúsculo (ao menos no exemplo). Neste caso é conveniente lembrar a questão da diferenciação de letras maiúsculos ou minúsculas. Talvez seja necessário o uso de UPPER (se for Paradox) - como o texto é procurado em seu formato completo. Dê sempre preferência por utilizar o sinal de "=" no lugar de "LIKE" Abraços
-
Dê uma olhada neste post.Observe que para executar este procedimento, devem haver índices ordenando a tabela pelos campos desejados. No seu caso, você já tem um pelo Nome, faltaria um índice secundário para Num-disco. Se coloco uma outra linha com mesmo nome e Num disc, dar o seguinte erro Isto vai realmente ocorrer já que chaves primárias (aquela com o '*') devem ser únicas.Se necessário for, você deverá organizar a estrutura de sua tabela de alguma outra forma. Abraços
-
calma não é para tanto :D Eder, desta vez você passou perto... Ao que me parece se campo de código está definido como NUMERIC e não INTEGER, então deveria ter trocado por: ParamByName('CODVISITA').AsFloat := Table1Codigo.Value; Abraços
-
parte do que você precisa pode tirar daqui: procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); procedure DrawBorder; // desenha as bordas inferior e direita begin with Sender as TStringGrid do begin // posiciona no canto inferior esquerdo da célula Canvas.MoveTo(Rect.Left, Rect.Bottom); // move desenhando uma linha até o canto inferior direito Canvas.LineTo(Rect.Right, Rect.Bottom); Canvas.LineTo(Rect.Right, Rect.Top -1); end; end; begin with Sender as TStringGrid do begin Canvas.Pen.Color := clBlack; if (ARow < FixedRows) or (ACol < FixedCols) then begin DrawFrameControl(Canvas.Handle, Classes.Rect(Rect.Left, Rect.Top, Rect.Right +1, Rect.Bottom +1), DFC_BUTTON, DFCS_BUTTONPUSH); DrawBorder; end else begin Canvas.Brush.Style := bsSolid; Canvas.Brush.Color := clWindow; Canvas.Pen.Mode := pmMerge; // desenha margens da célula só se não for a última linha do grid if ARow < (RowCount -1) then DrawBorder; end; // desenha o texto dentro do retângulo, sem preencher com cor de fundo Canvas.Brush.Style := bsClear; // se precisar trocar a cor da fonte é aqui Canvas.Font.Color := clRed; // desenha o texto dentro do retângulo Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]); end; end; - tem que definir a propriedade DefaultDrawing = False; - falta tratar State (se com foco, selecionado, ...)
-
[resolvido] Salvar Atalho Num Banco E Abrir O Arquivo Correspondente A
uma questão respondeu Micheus em Delphi, Kylix
se entendi direito, você precisa:- de algum modo cadastrar os atalhos. Os caminhos (path) do programas ou arquivos, podem ser obtidos manualmente (via componente Open Dialog) ou rastreando o disco; - fazer um mecanismo de busca no seu banco de dados - tem vários posts sobre isto aqui no forum; - executar o programa/arquivo. Pode ser usando WinExec - exemplo Se era isso, veja se consegue dar um start... -
C's querem me quebrar mesmo :D Sempre que aparece uma pergunta deste tipo, e não tenho a estrutura da tabela, eu sempre parto do princípio que o campo chave da tabela pai é duplicada na tabela filho. Logo, quando me referi a CODIGO você deveria ter entendido CODVISITA. Assim: Add('Select MAX(CODITEM) From IVISBLU where CODIGO = :CODIGO'); ParamByName('CODIGO').AsInteger := Table1Codigo.Value; passa a ser: Add('Select MAX(CODITEM) From IVISBLU where CODVISITA = :CODVISITA'); ParamByName('CODVISITA').AsInteger := Table1Codigo.Value; A hora que eu conseguir ler pensamentos este tipo de problema acaba mas, apesar de tentar, tá difícil. ;) Abraços
-
Churc, para ajudar a galera entender o que é isso: Friendship and inheritance
-
robinhocne, esse negócio de dar o mesmo título para vários problemas ainda vai deixar você sem respostas... Tomei a liberdade de alterá-la Bom, estou achando que seu problema é com as mensagens em inglês. Então, vamos distrinchar mais esta: Count of columns does not equal count of values = quantidade de colunas não é igual a quantidade de valores. Como eu já sei do que você está falando, você muito provavelmente está iniciando aquelas suas listas a de campos e a de valores com quantidade diferentes de itens, daí lá na sua procedure IncluirRegistro (imagino que a mensagem ocorre na inclusão), quando você monta sua SQL, as coisas não estão batendo - para cada campo informado na cláusula INSERT deve haver um valor em Value. Na dúvida, utilize o método do break-point que já lhe mencionei no outro post. Vou fazer a pergunta que já fiz em outra oportunidade e espero que você responda: Por que é que você optou por fazer um cadastro com toda esta "encrenca" ao invés de utilizar os componentes data-aware (os TDB...)? Abraços
-
podes crêr... para isto basta que você obtenha o maior valor para aquele header: With Query3 Do Begin Close; With SQL Do Begin Clear; Add('Select MAX(CODITEM) From IVISBLU where CODIGO = :CODIGO'); end; ParamByName('CODIGO').AsInteger := Table1Codigo.Value; Open; Table2CODITEM.Value := Query3CodITEM.AsInteger +1; end;voce estará obtendo o valor máximo para o CODIGO tal... Abraços p.s. lembra o que eu disse antes, pode retirar o order by para este tipo de consulta.
-
maikel, dá uma olhada neste link (tirado da sessão perguntas e resposta da revista ClubeDelphi nº 82)
-
ai aceitou.....mas deu erro na ultima linha do table: [Error] LCVisita.pas(414): Undeclared identifier: 'Fields' ainda tem algo estranho:depois de Query2Codigo.Open, onde é que deve estar o resultado do MAX? Acho que no Query2Codigo.Fields[0].AsInteger. De onde saiu este QryCodigo.Fields[0].AsInteger?
-
eu alterei o codigo assim: Query2Codigo.SQL.Clear; Query2Codigo.SQL.Add('Select MAX(codigo) from VISBLU order by codigo'); Query2Codigo.SQL.Open; Table1Codigo.Value := QryCodigo.Fields[0].AsInteger +1; da erro na primeira linha [Error] LCVisita.pas(410): Undeclared identifier: 'SQL' Porque este erro? :( porque você copiou ao pé da letra. Tem que captar a idéia apenas. estou achando que você simplesmente renomeou um componente TTable para Query2Codigo. É isso? SQL é uma propriedade de um TQuery, se você o utilizou teria que ter. Que componente você está utilizando? Áh!!! pode tirar aquele order by <nome_campo> que eu coloquei porque não tem a menor necessidade - foi barberagem mesmo. A única coisa que deve mudar em seu código é que você não inicializa mais o campo que é incremental. Você só tem este valor no momento que vai gravar. Outra coisa, em mestre detalhe, para gravar o detalhe, o mestre já tem que estar salvo. Então, quando você for incluir um novo item, já deverá ter gravado o header para poder utilizar o código gerado no BeforePost dele.