
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
thiago.mac, por esta parte destacada, poderia entender que você teria formatado seu computador. Isto foi feito?
-
Fernandinha, não sou especialista em SQLServer, mas para adiantar um pouco seu lado, seria interessante você observar estas estas duas mensagens : A primeira diz que o campo NOME foi truncado ou que há algum caracter neste campo sendo importado que não é compatível com a página de código esperada. Já a segunda, lhe diz onde verificar o problema: abra o arquivo em algum edito que lhe mostre a numeração das linhas e siga para a linha 14581 e localize a coluna referente ao campo NOME para verificar se você detecta se o texto está mesmo com tamanho maior que o esperado para o tamanho do campo ou se há algum caracter "estranho". Esta outra mensagem, diz que está está especificado em algum parâmetro de importação que especifica que quando houver um erro de "truncagem", o processo seja interrompido: Abraços
-
Peger o ultimo registro de uma tabela no oracle
pergunta respondeu ao prod de Micheus em Demais Bancos
prod, eu penso que independente do banco em questão, isto será um "problema" existente em todos eles. Você só terá o identificador exato, no momento em que adicionar o registro na tabela (ou fração de tempo antes, chamando o max, caso você não use a auto-numeração, trigger, ou coisa parecida). Mesmo em um sistema desktop, isto está sujeito a ocorrer - apenas em sistemas mono-usuários isto certamente não ocorre. O único jeito de você obter um número e ele não ser usado, seria guardá-lo em uma tabela, de modo que uma nova busca pudesse pegar corretamente o próximo. Mas, se um dos usuários cancela o processo, poderia ficar um "buraco" ou teria que haver um meio de este número ficar disponível para outro cadastro posterior. Abraços -
Ritmi, se você vai programar em Delphi não vai precisar fazer nenhuma tradução - as principais API's do Windows já estão disponíveis. Já olhou a cláusula uses de qualquer projeto Dephi? Lá sempre aparece Windows e Messages. Isto que você encontrou é a definição da função (header) e que está escrita em C++ linguagem utilizada pela Microsoft para a codificação. Quando quiser fazer qualquer busca com funções de API do Windows no Google, inclua sempre a palavra Delphi na busca - certamente haverão páginas com exemplos em delphi do uso da tal função. Se você programa em Delphi 7, poderá achar facilmente toda a referência às API's do Windows através da 3ª opção do menu Help, chama-se Windos SDK. Em outras versões você também deve achar, mas talvez não esteja tão explícita quanto nesta. Ficam algumas dicas: - o tipo de dados HWND é uma abreviatura de Handle Window e você irá encontrar outros tipos que começam com o H (o delphi tem um equivalente - THande, que é um Integer) - LPTSTR é um ponteiro para string terminada em zero. Aquele LP refere-se a Long Pointer. Veja com está a declaração da função em Delphi na unit Windows: function GetWindowText(hWnd: HWND; lpString: PChar; nMaxCount: Integer): Integer; stdcall; Outros tipos de dados que você pode encontrar nas definições das API's do Windows podem ser encontrados aqui (ref. msdn) Abraços
-
Preencher campo data ao clicar no botão novo
pergunta respondeu ao nsouza de Micheus em Delphi, Kylix
nsouza, não esqueça de que qualquer alteração no seu dataset só pode ser realizada quando ele estiver em modo de inserção ou edição (dsInsert ou dsEdit). No caso do exemplo do colega Jhonas, onde ele sugeriu o evento OnEnter, você teria que testar o Status do se o dataset para saber se você pode fazer alguma atribuição a um campo dele. O datasource ligado ao componente dbDataCadastro também possui esta propriedade e você pode usá-la para fazer o teste: procedure TForm1.dbDataCadastroEnter(Sender :TObject); begin if dbDataCadastro.DataSource.State in [dsInsert, dsEdit] then dbDataCadastro.Text := DateToStr(Now); end; a atribuição também poderia ser feita assim: procedure TForm1.dbDataCadastroEnter(Sender :TObject); begin if dbDataCadastro.DataSource.State in [dsInsert, dsEdit] then dbDataCadastro.Field.Value := Now; end; ou outra variante: procedure TForm1.dbDataCadastroEnter(Sender :TObject); begin if dbDataCadastro.DataSource.State in [dsInsert, dsEdit] then dbDataCadastro.Field.AsDateTime := Now; end; Mas quando você diz que ao clicar no botão... Então, não era para ter dúvidas sobre onde fazer isto: seria no OnClick do botão, logo após colocar o dataset em modo inserção/edição. Assim, esta é uma outra possibilidade: TForm1.bitNovoClick(Sender :TObject); begin dataset.Append; // observe que existem várias formas de atribuir um // valor a um campo, em qualquer lugar que você o faça // quando você adicionou os fields em design-time datasetDatCadastro.Value := Now; // ou quando você não adiciona em os fields em design-time // dataset.FieldByName('DatCadastro').Value := Now; // ou quando você sabe a ordem correta do field na lista, supondo que seja o 2º... // dataset.Fields[1].Value := Now; // ou outra forma menos convencional // dataset.FieldValues['DatCadastro'] := Now; end;onde dataset é o nome do seu componente deste tipo (seja TTable, TQuery, TClienteDataSet,....) e DatCadastro o nome do campo na tabela em questão. Mas, em questões específicas de inicialização quando da criação de um novo registro, você pode usar o evento OnNewRecord do dataset e lá fazer todas as inicializações necessárias. Tenha o foco sempre nos fields do dataset, ou seja, preferencialmente manipule ele e mão os componentes data-aware (como é o caso TDBEdit). Toda alteração realizada nos campos (fields) se refletirão automaticamente nos componentes data-aware e ao olhar o código, fica mais claro o que você está fazendo - em que campo de que tabela está mexendo. Tudo é uma questão de você escolher um método e tentar usá-lo como seu padrão. ;) Abraços -
:o :blink: petini, duas tabelas é pouco, mas uma tabela com 100 campos (para esta aplicação) é loucura! Quanto ao tempo de armazenamento, não se preocupe porque seu banco de dados não será nenhum monstro - tem muito sistema maior por ai rodando tranquilo. ;) Quem está começando deve ir bem devagar, não dá para ser urgente... Voce precisa ter um conhecimento mínimo para se envolver em algo deste tamanho (não que seja algo muito grande, mas por ser um assunto que não é dominado). Quando você não tem a real noção de como definir seu banco de dados (isto chama-se modelagem de dados), fica complicado fazer produzir algo com qualidade e que não irá lhe dar dor de cabeça no futuro. Procure ler um pouco sobre o assunto, você precisa levantar as informações necessárias, atividades a desenvolver e então montar a estrutura de dados necessária para no futuro tirar as informações deste seu banco de dados. Veja esse post com links de material sobre o assunto Modelagem de dados Abraços
-
fajo, não há uma instrução ou função para isto nos bancos de dados (pelo menos, que eu nunca vi isso por ai). Conforme o banco de dados que você está usando (e você não informou <_<), há possibilidade de implementar uma procedure nele, do contrário, tem que implementar no código mesmo. Na implementação no código, não tem complicação, basta que você percorra a lista de campos que tem as respostas e vá totalizando os sim e não.
-
ele é como a maioria dos SGBD - não tem nada a ver com tabelas paradox, DBF e Access. ;) Procure estudá-lo e vai encontrar algumas coisas interessantes. Na sua configuração, usando % em ambos os lados, não será feito uso de indice. Mas vamos supor que sua busca fosse para nomes que começassem com GERALDA, então a sua consulta ficaria: SELECT * FROM CLIENTE WHERE Upper(NOME_CLI) LIKE ('GERALDA%') Voce pode cria um índice para a tabela cliente onde informa que usará UPPER(NOME_CLI) e não apenas o nome do campo NOME_CLI (como é o usual). O SQL de criação seria algo assim: CREATE INDEX NOME_UPPER ON CLIENTE COMPUTED BY (UPPER(NOME_CLI)); Agora, a consulta acima, faria uso deste índice. Abraços
-
Isso acontece simplesmente porque a comparação é case-sensitive, ou seja, diferencia letras maiúsculas de minúsculas. A função Upper retorna para a comparação, o conteúdo de NOM_CLI com todas as letras maiúsculas. Para a comparação ser verdadeira, do outro lado da igualdade, o valor a ser comparado também deverá estar nesta condição para que o resultado seja verdadeiro. Então, você tem que comparar os dois lados usando o mesmo "padrão". Seguindo o exemplo do colega Kuroi, você poderia fazer deste modo: SELECT * FROM CLIENTE WHERE Upper(NOME_CLI) LIKE Upper('%Geralda%') Mas, na prática, como você está introduzindo a "Geralda" na consulta via programação (será constante para o banco), seria mais conveniente que você usasse a função de conversão da linguagem de programação antes de montar a string de consulta. Isso irá poupar trabalho do SGDB que terá que chamar a função apenas para o campo NOME_CLI, ou seja, uma vez para cada linha da tabela sendo comparada. C# não é minha praia, mas seria algo parecido com isto: ... string StringSQL, NameToSearch; NameToSearch = edtNameToSearch.Text; NameToSearch.ToUpper(); StringSQL = String.Format("SELECT * FROM CLIENTE WHERE Upper(NOME_CLI) LIKE Upper('%{0}%')", NameToSearch); ... Abraços
-
(Resolvido) Ordenar data por mês no access
pergunta respondeu ao Marcos Santana de Micheus em Delphi, Kylix
É, o Access usa "padrão" Microsoft. :wacko: Você faz uso da função Month (mês): SELECT Pessoal.Matrícula, Pessoal.[Nome da pessoa], Cargos.[Nome do cargo], Pessoal.[Data admissão] FROM Pessoal INNER JOIN Cargos ON Pessoal.Cargo = Cargos.Cargo Where [Grupo de Pagamento] = 2 Order By Month(Pessoal.[Data admissão]); Se precisar de outras funções do Access: MS Access Functions (ref. WebCheatSheet.Com) Abraços -
DROCHA, não sou expert no assunto mas, pelo que já li a respeito, basicamente quando você faz uma migração de versão do banco, torna-se mais seguro realizar o procedimento de backup do mesmo através do uso do utilitário gbak.exe (que acompanha o FB) ou mesmo através do IBExpert. Este procedimento é feito ainda utilizando a versão "antiga" do servidor. Depois de instalar a nova versão, então faz-se o processo inverso e restaura-se os dados para o "novo" banco de dados que será criado com as novas estruturas utilizadas pelo servidor. (é como costumo fazer e não tive problemas) Este seu problema ainda pode estar associado a questão de definição do CharSet. Veja o este: Migrando um BD para o FB 2.1 (será preciso você se registrar, mas é interessante estar ligado em sites sobre o assunto). O autor é Carlos Henrique Cantu (é "o cara" quando se fala de FB no Brasil) O artigo fala do problema na migração para a versão 2.1, mas vai caber para a 2.5, porque é justo fruto de características da versão 1.5. Neste artigo, ele também estará citando dois métodos (procedimentos) para migração de versão do banco (um deles é o que lhe citei). Penso que há um outro cuidado quando falamos de migração de versão: manter atualizada a biblioteca Client. Na instalação do servidor, há um passo em que voce pode instalar uma cópia da mesma na pasta do sistema (FBClient.DLL), bem como criar uma versão de compatibilidade (com o Interbase - GDS32.DLL). Dependendo da conexão você deve preocupar-se em atualizá-la corretamente. Quando você usa componentes DBExpress, lá no IBConnection por padrão "Vendor Lib" consta GDS32.DLL (nada impede que você mude para FBClient.DLL). Se usar ZeosLib, na pasta de instalação do component, há uma sub-pasta com as dll's adequadas a configuração que você fez no componente (você pode usar uma "genérica" ou a específica. E assim vai... São pequenas coisas, mas que considero relevante ter em mente. É conveniente estar ligado no que pode ter sido modificado em cada relese (ver release notes - no arquivo ou site). obs: Sendo este tópico especificamente sobre o banco de dados, ele ficaria mais adequadamente postado na respectiva sessão do forum (em Demais Bancos) ;) Abraços
-
DROCHA, como foi este procedimento de migração de versão? (com relação aos dados e não ao servidor)
-
AllNet, seguem alguns artigos (conceitos) para você ter uma ideia sobre a complexidade da coisa:- Conceitos Fundamentais de SRPLV - Projeto SIAV - Sistema de Identificação Automática de - Veículos - Projeto de Reconhecimento de Placas de Veículos Brasileiros - Outro usando técnicas de redes neurais - An Introduction to ANPR
-
Como tem muito iniciante perguntando por estas bandas, gostaria de deixar esta dica: Quando um erro de compilação do tipo Undeclared identifier aparece, como neste caso, e sendo o identificador supostamente parte integrante do Delphi, um ponto de partida é colocar o cursor sobre o texto "reclamado" (no código fonte) e teclar CTRL+F1 - isso ativa o help sensível ao contexto o qual tentará localizar a informação sobre a palavra no arquivo de ajuda. Digamos que fizéssemos isto sobre a palavra lopartialkey. Então, como resultado, seria apresentado algo assim: Tendo encontrado a ajuda sobre o nome procurado, você já sabe que escreveu direito e está no caminho correto. Assim, resta conferir apenas se a unit onde ela está declarada foi adicionada a cláusula uses do seu form/unit em questão. A ajuda lhe mostra bem no início do texto qual é esta unit, que é justamente a que o colega Jhonas sugeriu. Se a dificuldade for com o inglês, então a coisa vai engrossar, porque você encontra muita coisa boa é neste idioma (principalmente documentação dos programas). Para quebrar um galho, dá para recortar o texto do help e colar em um destes tradutores on-line - deixo este: ImTranslator.com Abraços
-
Eder Moraes, com a chamada não há mesmo. O problema é com unit como um todo. Como o Jhonas disse, é necessário ver as mensagens de erros da compilação (iniciadas por [Error]). Muitas delas são "falsas" já que são geradas por algum outro erro. Este vai ser o caso de quando o colega G@lileu colocar de volta no seu devido lugar a palavra Implementation que por algum motivo sumiu do seu código - com isso, muita coisa deve sair da lista de erros (vão permanecer a falta da declaração de algumas variáveis (Undeclared identifier) que não estão lá mesmo). OBS: 1) Vamos lembrar de usar a tag CODE quando postar código - ler códigos grandes como este, sem identação, é desencorajador. 2) Para os iniciantes, fica o link de uma vídeo-aula de "Debugação Básica" (ref. ActiveDelphi) - precisa se registrar para acessar. Abraços Motivo edição: Incluído link para vídeo-aula
-
Parafraseando o colega Jhonas, eu diria que se você usasse a pesquisa do forum poderia ter encontrado este meu post com a implementação dos eventos OnFind e OnReplace. Voce vai precisar da metade final do procedimento para OnReplace, estando ele dentro de um For que varre sua lista (conforme já sugeriu o colega Jhonas). Abraços
-
nsouza, é importante você tentar entender os exemplos que são postos, mas não deve levá-los ao "pé da letra". Isto você disse no post#3 E depois de reportar o erro, o Jhonas lhe fez esta pergunta no post#6 identificador não declarado: "Value" Este é um campo da sua tabela ? e se for, ele é string ou integer ? e no post#7 você mostra sua incerteza Na verdade ele está incorreto! Isto acaba acontecendo porque quando tentamos exemplificar, usamos nomes hipotéticos - não sabemos qual o nome que o "questionador" deu a sua tabela (não sabemos sequer, se é uma table ou uma query), campo, ... Então, neste caso, como estava sendo tratado de UF, este exemplo deveria ser adaptado ao seu caso, logo não poderia ser TIPO, mas sim UF: DM.tblFuncionarioUF.Value; Isto levando em consideração que você tenha adicionado os campos (Fields) ao seu dataset (table ou query). Porque do contrário, ainda teríamos a questão pensar no uso de DM.tblFuncionarioFieldByName('UF').Value Pela dúvida, percebe-se que você não deve ter lido algum material que lhe explique como usar trabalhar com banco de dados e foi logo se jogando a programar, pois do contrário, você estaria usando TDBComboBox (como já sugeriu o colega Jhonas) - seria a opção mais simples para quem está começando - usaria componentes data-aware. Dê uma olhada nesta apostila Banco de Dados com Delphi (ref. Apostilando.com), ela é adequada ao iniciante, já que passa os conceitos básicos e acredito que você compreenderá que são estes componentes. Os bancos mudam, os componentes de acesso também, mas o conceito (a idéia) sobre como você interage com eles é sempre a mesma. Bom estudo e não desanime.
-
JGS, você não quer apeanas capturar uma área do desktop, mas sim gerar um vídeo com as sucessivas capturas - é o que o software que você cita faz. Bom, neste caso, acho que você precisará usar o recurso de captura similar ao do post que citei, sendo que a captura seria controlada por um timer, e as "fotos" teriam que ser passadas a um encoder para gerar o vídeo final. Não é a toa que estes programas são vendidos. ;)
-
Thaise Piculi, seu problema está no fato de você usar o campo que recebe o resultado. Voce quer calcular o valor TOTAL quando o VALOR_VENDA ou QUANTIDADE mudar, não é mesmo?! Voce usou o evento OnChange do campo TOTAL (qryRelatoriosTOTALChange)! Se voce ler de novo o que passei para o Hudson Cavazin: Que no seu caso seriam dos campos qryRelatoriosVALOR_VENDA e qryRelatoriosQUANTIDADE. Então, baseado no que disse a ele, seu código deveria ser algo assim: procedure Tdmbanco.qryRelatoriosVALOR_VENDAChange(Sender: TField); begin qryRelatoriosTOTAL.AsFloat := qryRelatoriosVALOR_VENDA.AsFloat * qryRelatoriosQUANTIDADE.AsInteger; end; Onde o procedimento do evento OnChange so campo VALOR_VENDA (qryRelatoriosVALOR_VENDAChange) também seria atribuído ao mesmo evento do campo QUANTIDADE. Abraços
-
Andre_2008, foi um erro "gritante" meu. É que comecei com uma idéia e no final estava pensando em outra coisa mais "simples". Já fiz a correção no meu post anterior para prejudicar a outros. O fato do travamento, é culpa de eu ter mantido a variável OffSet no procedimento. Na verdade, com a configuração que lhe passei, ela não é necessária. No lugar dela, usa-se o PosHttp que estará sempre ao final da string copiada, de onde deve ser o ponto de partida para a próxima pesquisa. PosHttp := PosEx('http://', resultado, 1); while PosHttp > 0 do begin Delete(resultado, 1, PosHttp -1); // apagamos o que está antes do que interessa PosHttp := PosEx('/', resultado, 8)); // procuramos pela "/" após o "http://" (7 caracteres) URL := Copy(resultado, 1, PosHttp); // copiamos o endereço até a "/" // aqui você insere esta URL no componente de lista que quiser PosHttp := PosEx('http://', resultado, PosHttp); // a partir da última posição, busca o próximo http:// end; Uma última observação, sobre o exemplo que passei: ao final do procedimento a variável resultado estará praticamente limpa, pois a medida que vamos achando endereços, vamos excluindo a parte processada (usando a função Delete). Se insto não for conveniente, então teremos mesmo que pensar no uso da variável OffSet, na forma como eu tinha pensado inicialmente (mas acabei mudando de idéia). Abraços
-
Rotina SQL que verifica inadimplencia
pergunta respondeu ao Geomar Canjundo de Micheus em Delphi, Kylix
Geomar Canjundo, acho que não tem muito mistério. Se você precisa inserir vários registros de "uma" só vez, você deve usar um loop e em cada intereção dele, você precisa:- usar um Append, para abrir um novo registro; - inicializar os campos adequadamente (possivelmente você vai iniciar um campo com Nº da propina e data de vencimento); - usa o Post (ou ApplayUpdates - vai depender dos componentes que você usa) para gravar o registro. esse loop deve ser controlado pela quantidade de parcelas que você quer gerar. Abraços -
Nunca usei o WebBrowser, por isto a pergunta. De qualquer forma, você pode seguir a mesma idéia que passei antes - usando PosEx, voce pode buscar dentro da "grande" string, as substrings que você precisa. Na situação posta, você usa o PosEx para encontra os "http://" e o offset na função vai sendo incrementado de modo a procurar a próxima ocorrência, sem que fique no mesmo lugar. Veja: WebBrowser1.Navigate(resultado); PosHttp := PosEx('http://', resultado, 1); while PosHttp > 0 do begin Delete(resultado, 1, PosHttp -1); // apagamos o que está antes do que interessa PosHttp := PosEx('/', resultado, 8)); // procuramos pela "/" após o "http://" (7 caracteres) URL := Copy(resultado, 1, PosHttp); // copiamos o endereço até a "/" // aqui você insere esta URL no componente de lista que quiser PosHttp := PosEx('http://', resultado, PosHttp); // a partir da última posição, busca o próximo http:// end; Veja que apenas usei o que há havia lhe passado. Mais que isto, vou fazer a rotina para você e não vai aprender. ;) Abraços Motivo da edição: Retirada da variável OffSet e sua substituição por PosHttp na função PosEx.
-
JGS, acho que o Jhonas quiz que você observasse no help que esta interface está declarada na unit ActiveX - inclua ela na cláusula uses. Obs: Não diga que "retorna um erro em ...", Informe qual o erro especificamente, aquele que o compilador lhe mostra - fica mais fácil de ajudar. ;) Abraços
-
Andre_2008, esse resultado é retornado para você em uma string? em uma TStringList?
-
Andre_2008, veja que é simples.Após você encontrar as duas barras separadoras do http e domínio, a próxima barra é aquela onde o conteúdo posterior é ignorado. Voce pode fazer uso da função Pos para retornar a posição das duas barras na string. Despois, você usa PosEx para retornar a próxima barra, informando a partir de onde a substring deve ser pesquisada. (veja detalhes das funções no help) Veja este exemplo didático: var PosBarraDupla, PosBarraSimples :Integer; url, Fullurl :string; begin Fullurl := 'http://www.humanmetrics.com/cgi-win/JTypes2.asp'; PosBarraDupla := Pos('//', Fullurl); // encontramos posição da primeira barra da dupla PosBarraSimples := PosEx('/', Fullurl, PosBarraDupla +2); // iniciamos pesquisa, pulamos a barra dupla url := Copy(Fullurl, 1, PosBarraSimples); end; Abraços