
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
isto é impeditivo para a definição de uma chave primária - ela sempre deverá ser única. Você deve estar tentando mudar a estrutura da tabela para definir o campo número do patrimônico como chave, é isto? Se for, é como eu disse acima - não são permitidos valores iguais em um campo que será chave primária.Se a duplicação é necessária, uma solução é você criar uma chave composta (o número do patrimônio + outro campo) que não se repete na tabela. amauri_filho, mas e o questionamento no título do tópico: Não Permite Excluir Do DB? Você só falou sobre salvar chave primária no database desktop. :huh: Abraços
-
Eder, acredito que você poderia fazer uma combinação de uso das funções de data com uma função para conversão de número para extenso (você encontra várias na net ,se bem que a maioria é bem mais complexa do que você precisa...). Você teria apenas que ver essa questão da parte inicial do texto, quando deverá aparecer "primeiro", "segundo"... "décimo quinto" - será sempre neste linha?
-
Com certeza é uma solução, mas devo lhe deixar ciente de que não é a melhor. Sem dúvidas, utilizar a função MAX seria o ideal, porque a consulta roda no banco (apesar de você utilizar Paradox, mas fica o conceito para um banco de verdade). Da forma como ficou, está sujeito a um processamento/transito de dados maior que o necessário, já que haverá bufferização da consulta realizada e você irá mover-se para a última. Faz o seguinte para diminuir este "problema": obtenha o resultado em ordem decrescente e daí você pega o primeiro registro (não tem que "ir" até o último): With Query3 Do Begin Close; With Sql do Begin Clear; Add('Select IVISBLU.CODITEM, IVISBLU.CODVISITA From IVISBLU '); Add('WHERE IVISBLU.CODVISITA ='+ QuotedStr(table1CODIGO.Text)); Add('ORDER BY IVISBLU.CODVISITA DESC'); // *** OBSERVE o --> DESC end; Open; Table2CODITEM.Value := Query3CODITEM.AsInteger +1; Ene; sem problemas, a idéia não é apenas resolver o problema (tipo faz assim...), mas também, explicar/tirar dúvidas (na medida do possível). Senão, como você vai resolver outro problema parecido. ;) Abraços
-
É isto aí, esta era a idéia. Boa solução ;)
-
Eduardo Dicarte, por acaso você está com o mesmo problema? Seja claro.
-
Foi por isso que perguntei: Parece que o campo código não está sendo gravado na sua tabela item, dai a cada busca pelo código da tabela mestre, nunca encontra ele e obtém o valor 1 para o item - grava então: Codigo = 0 e Item = 1; o que vai resultar em key violation a qualquer nova inclusão, mesmo de outro item para um segunto registro na tabela principal. Na verdade, este cenário só vai acontecer se o campo código na tabela detalhe não for obrigatório; E é fácil de verificar: após incluir o primeiro item, ou você debuga e verifica o valor do código no momento em que vai gravar o item ou, após gravado o 1º item, abra o Database Desktop e verifique como estão os dados na tabela de itens. Dê uma averiguada, porque aparentemente, pelo que está na consulta aqui, ela deveria estar funcionando - parece mesmo apenas o código estar ficando nulo ou algo parecido. Só mais uma curiosidade: se a consulta Query3 está "Select MAX(CODITEM) From IVISBLU where CODVISITA = :CODVISITA", como é que você tem um campo adicionado a query chamado Query3CODITEM? Supostamente deveria ser algo como Query3MAXOFcodigo, já que você não declara um nome para a coluna, e neste caso, a consulta deveria estar "Select MAX(CODITEM) AS CODITEM From IVISBLU where CODVISITA = :CODVISITA" Abraços
-
Jonas, acho que ele ainda precisará se preocupar com a questão da posição em que o mouse foi clicado. Tenho a impressão que deveria ser avaliado o deslocamento do mouse (dx e dy) em relação a posição inicial, ou outra abordagem. Observe que se o cara clica no meio da figura e faz o primeiro movimento, você atribui o Left e Top para esta posição, ou seja, a imagem dará um "salto".
-
apenas salientando que a questão é fazer uma pesquisa, não substituição.Jonas, acredito que deva ser exemplificado esta situação. Há também um tópico de 2006 (Como Usar A Caixa De Pesquisar Para Pesquisar Em Um Memo?) sobre este assunto.
-
quase... Considerações: - Se o somatório tem que ser exatamente igual a 100, pouca diferença fará o teste qtdade < 100, ou seja, ele não é necessário - não acha? - Selecionar apenas as produções em que a soma seja igual a 100, pressupõe que haja algum campo a ser agrupado. - utilizar uma função de agrupamento (SUM) com outros campos (*), implica em utilizar a cláusula GROUP BY contendo todos estes campos. Isto pode impedir a obtenção do resultado esperado. Por ex. (meio bobo, mas para tentar explicar), supondo uma consulta a uma tabela de itens de nota, utilizando os campos: NumNota, CodProduto e Qtd onde hajam os dados:+---+---+----+ |NOT|PRO| QTD| +---+---+----+ | 1 | 1 | 5 | | 1 | 2 | 15 | | 1 | 3 | 10 | | 2 | 1 | 10 | | 2 | 2 | 40 | | 3 | 2 | 5 | | 3 | 3 | 15 | | 3 | 4 | 10 | +---+---+----+ 1) agrupamento NumNota, CodProduto: select NumNota, CodProduto, SUM(Qtd) group by NumNota, CodProduto vai resultar em+---+---+----+ |NOT|PRO| QTD| +---+---+----+ | 1 | 1 | 5 | | 1 | 2 | 15 | | 1 | 3 | 10 | | 2 | 1 | 10 | | 2 | 2 | 40 | | 3 | 2 | 5 | | 3 | 3 | 15 | | 3 | 4 | 10 | +---+---+----+ ou seja, a própria tabela, porque utilizamos todos os campos no agrupamento 2) agrupamento NumNota: select NumNota, SUM(Qtd) group by NumNota vai resultar em+---+----+ |NOT| QTD| +---+----+ | 1 | 30 | | 2 | 50 | | 3 | 30 | +---+----+ ou seja, totalizamos (agrupamos) por NumNota - temos o total para cada nota 3) agrupamento CodProduto: select CodProduto, SUM(Qtd) group by CodProduto vai resultar em+---+----+ |PRO| QTD| +---+----+ | 1 | 15 | | 2 | 60 | | 3 | 25 | | 4 | 10 | +---+----+ou seja, totalizamos (agrupamos) por CodProduto - temos o total para cada produto Como vê, para cada agrupamento um resultado diferente. mas, continuando... Talvez você possa utilizar a cláusula HAVING (deu uma olhada no post do Jonas?) para definir que a quantidade deva ser 100. Mas, como demonstrei acima, utilizar GROUP BY, pressupõe um agrupamento de itens. - Que campos você tem nesta tabela ControleDeProdução? - Que campos deverão ser agrupados? Abraços
-
jonas, como você não se registra, não posso lhe orientar por MP, então coloco este post. Gostaria que você utilizasse os marcadores de QUOTE (icone com balãozinho) quando estiver querendo comentar o texto do post que está respondendo. Alguns posts ficam ruins de ler (mistura seus comentários com o texto sendo comentado). Grato.
-
experimenta o seguinte:- remove o código do evento; - remove o componente do relatório; - grava seu relatório; - feche o projeto, para garantir que será removido tudo da memória, em seguida abra-o novamente; - compile e execute e veja que ele está OK; - estando, carregue o relatório adicione denovo o QRLabel e escreva o código; - compile e execute. Se não adiantar, a sugestão é que você recrie o relatório. Coisa parecida já aconteceu comigo - não dá para entender, mas acontece. Abraços
-
permitam-me dar um "pitaco" por aqui...Não trabalhei com as ferramentas .NET da Borland (.Net, só mexi com ASP), mas como tinha em mente que .NET trata-se de uma Plataforma de desenvolvimento (assim como quando falamos em Win32) em que podemos utilizar diferentes linguagens de programação para gerar o código final. Então, fui dar uma pesquisada para entender um pouco mais e encontrei algumas coisas que podem ajudá-lo e a quem mais se interessar pelo seu tópico. Este artigo (O que é .NET) deve lhe ajudar a sanar algumas de suas questões. Como tinha em mente, em termos de .NET é a mesma coisa, mas em termos de linguagem de programação, a sintax utilizada no código é aquela correspondente a linguagem escolhida. Os exemplos abaixo (ref. projetando.NET - as "guias" só funcionam no IE, Firefox não) são parte do código existente no artigo. Tem uma versão em C# e outra em VB.NET, assim também deverá uma versão para a sintax usada em Delphi (pascal). Código em C#: using System.Configuration; using System.Data.SqlClient; //... private static string GetConnStringFromConfigFile(string key) { Configuration config = ConfigurationManager.OpenExeConfiguration( ConfigurationUserLevel.None); ConnectionStringsSection conStrings = config.ConnectionStrings as ConnectionStringsSection; if (config != null) { SqlConnectionStringBuilder s = new SqlConnectionStringBuilder( conStrings.ConnectionStrings[key].ConnectionString); return s.ConnectionString; } return string.Empty; } //... Console.WriteLine(GetConnStringFromConfigFile("ConnString")); Memo código em VB.NET:Imports System.Configuration Imports System.Data.SqlClient '... Private Shared Function GetConnStringFromConfigFile(ByVal key As String) As String Dim config As Configuration = _ ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) Dim connStrings As ConnectionStringsSection = config.ConnectionStrings If Not IsNothing(connStrings) Then Dim sb As New SqlConnectionStringBuilder( _ connStrings.ConnectionStrings(key).ConnectionString) Return sb.ConnectionString End If Return String.Empty End Function '... Console.WriteLine(GetConnStringFromConfigFile("ConnString")) Abraços
-
acho que você deveria utilizar Query3CODITEM.AsFloat, já que está tratando de numéric, ok!? isto é novo!!!Voce conferiu se: - está inicializando Table2CODVISITA.Value := Table1CODIGO.Value em cada Insert/Append na Table2? - ao executar a busca pelo novo valor (Query3), o registro da tabela detalhe já está gravado? Carinha já to quase desistindo......e dando um tempo...hehehe e você não calcula ele no BeforePost? (deveria ser) é eu acho que teria que criar um campo intermediário (inteiro), mover apenas a parte inteira para ele, dropar a coluna numeric, criá-la novamente como integer, mover a coluna temporária para a nova e transformá-la em autoincremente (mais ou menos tudo isso)Independente disto, é recomendado que você não utilize campos numeric para a finalidade aque exposta (código sequencial de controle)
-
eu respondi o que você perguntou: isto tudo está ali. Colocou no evento OnDrawCell para ver o resultado? isto é outra questão. A edição você habilita através da propriedade Options (se não me engano - isto se já não for o padrão). Mas, a princípio se você precisar inicializar alguma célula, você pode fazer através de: StringGrid.Cells[num_col, num_lin] := 'testo a ser mostrado'; o evento ocorre quando uma célula deve ser desenhada, então, normalmente você não vai acessar uma posição fixa. Vai utilizar os parâmetros recebidos ACol (coluna) e ARow (linha) para acessar o texto na celula nesta coordenada e desenhá-la usando o canvas do StringGrid.Acho que o exemplo que coloquei deixa estas coisas relativamente claras.
-
Como Gravar Arquivos Avi Ou Mpeg Pequenos
pergunta respondeu ao helena.dm de Micheus em Delphi, Kylix
paulobergo, realmente tem que ter um jeito, pois até conferi no programa VidCap32 que acompanha a webcam e ele tem o recurso de seleção do coder. Andei dando mais uma investigada mas não achei nada claro sobre isto. Você chegou a experimentar este programa antes de utilizar o MoveMaker? Além da opção em memória, ele permite também gravar direto para o disco, mas daí fica sugeito a perda de muitos quadros. Caso não o tenha, dá uma olhada neste link que possui o exe e o help. Abraços -
Acho que sim. Ao menos, quando se altera, no componente TADODataSet, a propriedade CommandType para cmdStoredProc, a propriedade CommandText torna-se uma caixa de lista onde aparecem tais consultas. No componente TADOStoredProc, elas também são listadas na propriedade ProcedureName. acredito que utilizando um dos componentes citados você consegue alguma coisa.Siga as orientações presentes nos links que o Jonas passou. adiantando: Se a consulta for parametrizada, você tem que declarar o parâmetro nestes componentes, via propriedade Parameters - definir Type, Size e Name conforme declarados lá na consulta. Por exemplo, lá no editor de consultas (no modo SQL) do Access você coloca: no Delphi, na propriedade Parameters do componente ADOStoredProc1 clica no botãozinho com "..." e na caixa que aparece adicionar um parâmetro. Na janela Object Inspector, você define DataType=ftInteger e Name=param1 Abraços
-
juniorboll, além do já descrito acima, a partir do D7 (não sei se iniciou no 5 ou 6), os componentes visuais tem a propriedade Anchors, onde você define como ele se comporta no caso de um resize do seu form. Não é um escalonamento, apenas um ajuste de dimensões. Você determina se as posições onde as coordenadas do seu componente ser fixarão em relação ao form, se à direita, esquerda, encima e/ou embaixo. O padrão é ficar fixo no canto superior esquerdo (Left e top = true; right e botton = false). Para compreender como esta propriedade funciona, só tem um jeito: mexe com elas e redimensionar o form (em design-time), daí você vai saber em que situação este recurso é útil ou não. Abraços
-
mas se ainda precisar pegar o nome do usuário logado, segue um exemplo... procedure TForm1.Button1Click(Sender: TObject); var BufSize :cardinal; UserName :array[0..127] of ansichar; begin BufSize := SizeOf(UserName); if BOOL(GetUserName(UserName, BufSize)) then ShowMessage(UserName); end;
-
czanotta, pelas minhas contas teria que ter mais uma "trancadinha" - você tem 3 declarações do método Button2Click. :blink: Tente remover dois deles do código fonte. (seleciona a linha e exclui ela). Estas declarações são como os Highlanders: Só pode haver um! ;) Resta saber como você conseguiu isso. :huh: Abraços
-
Eu não consegui usá-lo com odescrito, mas no help do ADOCommand, diz que ele serve exatamente para as expressoes de SQL que NÃO retornam diretamente um recordset, mas que devemos utilizar com com um store ou com om dataset. Acho que é uma questão de interpretação. Vejamos o parágrafo completo: - O início do texto cita que este "componente" é frequentemente utilizado para execução de comandos SQL como CREATE, ALTER, DROP (ref. What are the difference between DDL, DML and DCL commands?).- Na parte em vermelho, há a recomendação de que para comandos SQL que retornem um conjunto de resultados sejam utilizados TADODataSet, TADOQuery ou TADOStoredProc. - Por fim, está dito: entretanto, o método execute do TADOCommand é capaz de retornar um recordset. Mas isso ocorre se não seguirmos as indicações mencionadas e executarmos um comando como SELECT. Bom, tratando do seu questionamento, o qual está relacionado a última parte do parágrafo acima, o uso de um ADO dataset separado para receber os dados retornados seria algo assim (faça o teste): No form, além do TADOCommand, adicione um TADODataSet (conforme orientado na nota do help), em seguida coloque o código: ... ADOCommand1.ConnectionString := ... // você já deve ter ela inicalizada ADOCommand1.CommandText := 'select codigo, descricao from tb01'; ADODataSet1.Recordset := ADOCommand1.Execute; if ADODataSet1.Active then ShowMessage('Descrição do 1º registro retornado: ' + ADODataSet1.Fields['Descricao'].Value); Observe que ao ser chamado Execute, haverá sim o retorno de um conjunto de registros (recordset), o qual será atribuído a propriedade RecordSet do ADODataSet, que por sua vez já se encontrará aberto. Entretanto, se utilizar o mesmo método para a aplicação que você quer fazer:... ADOCommand1.ConnectionString := ... // você já deve ter ela inicalizada ADOCommand1.CommandText := 'insert into tb01 (descricao) values ("teste")'; ADODataSet1.Recordset := ADOCommand1.Execute; if ADODataSet1.Active then ShowMessage('Descrição do 1º registro retornado: ' + ADODataSet1.Fields['Descricao'].Value); não funciona pois, como já mencionei antes, o comando INSERT é um dos que não retorna "algo". Você vai observar que no momento da chamada a Execute, ocorrerá uma exception com a mensagem: "ADORectSet1: Recordset is not open". E se lá no código inicial que você postou, você fizer o teste do estado do recordset retornado:... r := adoconnection1.Execute('insert into tb01 (descricao) values ("teste")'); if r.State = adStateOpen then s:=r.Fields['codigo'].Value;você vai ver que ele é retornado fechado (adStateClosed) após a execução do comando. Espero ter ajudado a esclarecer esta situação Abraços
-
sabe aquele quote que você colocou no post inicial (inicializando a query e abrindo ela)... Você tem que executar este procedimento cada vez que quiser atualizar seu DBGrid (isto apenas porque você tem uma query ligada ao DBGrid). Só que isto pode gerar uma pequena "piscada" no seu grid, já que você fecha a consulta (o grid fica vazio) e em seguida abre denovo (mostra os dados atualizados). Para minimizar isto, você deve utilizar os métodos DisableControls e EnableControls do seu componente query. Segue alteração naquele seu código acima: With QryPra do begin DisableControls; // *** evita que o grid seja atualizado Close; Sql.Clear; Sql.Add ('Select P.Aluno, P.Instrutor, P.Data, P.Horario, P.Aluno From Praticas P,' + 'Instrutores I Where P.Aluno=' + txtcod.Text + ' AND I.Codigo=P.Instrutor ORDER BY P.Data, P.Horario'); Open; EnableControls; // *** habilita a atualização do grid end;
-
com Table, que eu saiba, não teria outra melhor. E com query, seria similar.
-
este perfeito é visualizando em design-time? o campo XXX está definido na propriedade Expression do QRGroup?
-
robinhocne, após a inclusão que você faz através da tabela (TTable), para atualizar um consulta query, você terá que reexecutá-la - só isso. ;)
-
Eder, é foi barberagem minha mesmo. É claro que o código tem que estar deste jeito. Parece que você teria, na Query3, adicionado o SQL e também os fields da mesma em design-time. Pelo menos é o que parece pelo nome do componente Query3CODITEM. Se isto é verdade, então você não precisa mudar a propriedade SQL em run-time e pode definir na propriedade Params, o tipo de dado que deve ser o parâmetro passado (no seu caso um NUMERIC, ou seja Float). Dê uma verificada. Faça um teste. Execute esta query no Database Desktop. Dê um código conhecido ao parâmetro e execute a query. Se você não obter o erro, então, vai ter que estar no componente. já está começando a faltar idéias.. :)