
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
Cyberhack, não seria o mesmo assunto daquele seu outro tópico: "Manipular Memoria Dinamica E Editar A Memoria"? Acho que já teria um ponto de partida naquele post#8 do Churc. Talvez fosse melhor dar continuidade lá, assim o pessoal segue o raciocínio. O que você me diz? Abraços
-
95... :o é só impressão. Ainda não me dei por vencido... :D Bom, para começar, você não tem que gerar a tabela com os 95 campos. Esta tabela seria para receber apenas o resultado das suas duas consultas, as quais tem apenas 5 campos: - VALOR_FRETE_TOTAL; - CONTADOR_TOTAL; - KG_CALCULO_TOTAL; - VALOR_N_FISCAL_TOTAL; - UNIDADE. Vamos lá... Adicione um componente TTable ao seu projeto e dê o nome TabTmp (p. ex.). Ele será utilizado para a criação da tabela temporária, bem como será populado com os dados das duas consultas. Para criar a estrutura da tabela temporária igual as das tabelas QUERYsaida e QUERYentrada usaremos a propriedade FieldDefs de uma delas (já aberta) - isto simplifica muito as coisas (mesmo que houvessem 95 campos a copiar). O código parece grande e complexo, mas é apenas impressão devido aos comentários (retire-os e verá que é bem enxuto): // no local onde será chamado o relatório para ser mostrado procedure TForm1.... procedure CopiaResultados(DataSet :TDateSet); var Idx :Integer; begin DataSet.First; while not DataSet.EOF do begin TabTmp.Append; for Idx := 0 to DataSet.FieldDefs.Count -1 do TabTmp.Fields[Idx].Assign(DataSet.Fields[Idx]); TabTmp.Post; DataSet.Next; end; end; begin // as consultas devem estar abertas para termos // a estrutura dos campos disponíveis para cópia QUERYsaida.Open; QUERYentrada.Open; try // estas propriedades podem ser setadas // em design-time. Neste caso, remova elas daqui TabTmp.DatabaseName := qryPesq.DatabaseName; TabTmp.TableName := 'TmpTable.db'; TabTmp.TableType := ttParadox; // se o arquivo existir, deve ser eliminado if FileExists(TabTmp.DatabaseName +'\' +TabTmp.TableName) then TabTmp.DeleteTable; // limpamos qualquer definição de campos que haja TabTmp.FieldDefs.Clear; // copiamos a estrutura de campos a ser copiada TabTmp.FieldDefs.Assign(qryPesq.FieldDefs); // limpamos qualquer definição de índices que haja TabTmp.IndexDefs.Clear; // chave primária TabTmp.IndexDefs.Add('', 'UNIDADE', [ixPrimary]); // chave secundária a ser utilizada para a listagem em // ordem decrescente de valores, conf. definição da chave TabTmp.IndexDefs.Add('FRETE_TOTAL_IDX', 'VALOR_FRETE_TOTAL', [ixDescending]); // Criamos a tabela com a estrutura e índices definidos acima TabTmp.CreateTable; // selecionamos a chave desejada - ordem decrescente de valores TabTmp.IndexName := 'FRETE_TOTAL_IDX'; TabTmp.Open; // inserimos os dados da consulta Saída na tabela temporária CopiaResultados(QUERYsaida); // inserimos os dados da consulta Entrada na tabela temporária CopiaResultados(QUERYentrada); // Neste ponto a tabela TabTmp contém todos os registros // dasduas consultas e estará listado em ordem decrescente // devido a definição do índice utilizado. // Resta agora fazer a chamada ao relatório configurado // para mostrar todos os registros desta tabela ... TabTmp.Close; finally QUERYsaida.Close; QUERYentrada.Close; end; end; Experimente e qualquer dúvida é só avisar. Abraços
-
Eder, esta resposta acho que o Jhonas já lhe deu. Vamos a uma tentativa de solução: Select Clientes.Cnpj, Clientes.Nome From CLIENTES WHERE NOT EXISTS (SELECT CLIENTES.CNPJ FROM MCLIENTES WHERE MCLIENTES.CNPJ = CLIENTES.CNPJ) Order By Clientes.Nome, Clientes.Cnpj O que estará fazendo, é listar de CLIENTES todos aquelas linhas (registros) em que o CNPJ não exista na outra tabela MCLIENTES. Abraços
-
A posição do Label2 não é relevante para a questão. Eu coloquei propositalmente naquela posição justamente para que ele refletisse o conteúdo da última linha lida, logo tinha que ser após o readln. Veja que ser no último readln, não houve o que ler (fosse o suposto EOF encontrado) a variável linha, supostamente (não tenho certeza) deveria estar vazia. De qualquer modo, o relevante é você observar a lista. Não é à toa que ela é movida para seu fim. Observe a última linha inserida (veja o anexo). Ela representa a última linha que seria inserida na tabela, já que está na mesma posição que a proposta. Abraços
-
Qual o sistema operacional q você está utilizando? É o mesmo de quando seu Delphi funcionava - antes de formatar sua máquina, conforme você mencionou no 1º post?
-
Eder, dá uma olhada lá no penúltimo parágrafo do post#4. Veja se consegue implementar aquela idéia. Qualquer dúvida avisa. ;) Abraços
-
Denis Courcy, fiquei intrigado com esta afirmação, porque, como disse, já faz algum tempo que não precisei implementar este tipo de rotina. Entretanto, estava quase certo de que ocorreria o que mencionei (justamente porque na época, pareceu-me que passei por esta situação). Assim, para não ficar com a bendita da dúvida, implementei este exemplo simples (ver anexo). Observe os resultados. Abraços Importacao.zip
-
Eder, só para confirmar: sua consulta resulta apenas nestes 4 registros?Se sim, então deve estar ocorrendo o que eu imaginava quando coloquei em meu primeiro post: "Você ainda está utilizando o Paradox, não é. Talvez o resultado não fique bom." É que se eu não me engano (por isso havia mencionado), o Paradox não faz a ordenação após obtenção do resultado do UNION. Isto quer dizer que, das quatro linhas obtidas, o 1 e 2º correspondem a ordenação da primeira parte do UNION (1º SELECT), enquanto que 3º e 4º a segunda parte (2º SELECT). você pode conferir isto, separando os dois e executando um um de cada vez no DBD. então, acho que é aquilo que citei acima, você poderia conferir conforme sugeri. com certeza, não trata-se de uma questão da ferramenta de relatórios, mas sim da consulta (o resultado dela). Voce ainda tem a opção de utilizar a tabela temporária. ;) Abraços
-
Eder, apenas explicando a origem do problema: é que você utilizou EOLN (End Of LiNe) ao invés de EOF (End Of File). Denis Courcy, faz tempo que não implemento este tipo de leitura, então vou perguntar para tirar a dúvida: da forma como você sugere - fazer o Readln ao final do laço - não irá acontecer de a última linha deixar de ser processada, já que a úlima linha é lida e o sinalizador de EOF "encontrado"? Abraços
-
Experimentou a outra sintax: CASE WHEN R.status = 1 THEN 'Criada' WHEN R.status = 2 THEN 'Aguardando Orçamento' WHEN R.status = 3 THEN 'Aguardando Aprovação' WHEN R.status = 4 THEN 'Em produção' WHEN R.status = 5 THEN 'Finalizada' ELSE 'Cancelada' END
-
Junior, supostamente, uma possibilidade desta intermitência seria o fato de você ter acionado o CAPS LOCK. Observe que que você testa apenas pelo "S" maiúsculo estaria faltando verificar o minúsculo. nego drama, da forma como está construído o programa do colega Junior (onde a tela é limpa e montada a cada interação) o uso do Repeat..Until seria mesmo a mais apropriada.Lembro que no uso do While, seria apropriado a inicialização da variável antes de seu teste - o que ocorre logo no início, diferente do Repeat..Until, que testa no fim após lida a variável de controle. Isto não procede. As interações/loops (while ou repeat) são executadas até que uma condição seja satisfeita, ou seja, até que o teste da condição retorne TRUE (verdadeiro). Sendo assim, não há qualquer limitação quanto ao tipo de dados a ser usado como controle. Abraços
-
Parabéns KaKarotto Bem vindo ao grupo e continue com o bom trabalho.
-
(Resolvido) Tratando ReceiveText() -Socket - Delphi
pergunta respondeu ao Jhonatas araujo de Micheus em Delphi, Kylix
se você postar em um destes sites de compartilhamento (tipo o Rapid Share), mais pessoas poderão vê-lo e tentar ajudá-lo. Pode ser? Abraços -
Não pensou possibilidade de atualizar a versão do banco?Quanto a ferramentas, não foi para você que citei umas existentes no site do MySQL, porém para a versão 5? Abraços
-
(Resolvido) Pesquisa por intervalo de datas
pergunta respondeu ao Tatiane.InterArt de Micheus em Delphi, Kylix
Tatiane, dê preferência a utilizar a parametrização. É um bom hábito e que poderá evitar futuras dores de cabeça. Alguns bancos, como o MySQL espera a formatação da data yyyy-mm-dd. Com certeza diferente da que você está usando na concatenação e isto resultaria em erro caso este fosse o seu banco. Posts que citam estas situações: http://scriptbrasil.com.br/forum/index.php...st&p=421910 http://scriptbrasil.com.br/forum/index.php...st&p=379915 http://scriptbrasil.com.br/forum/index.php...st&p=341003 Abraços -
João, desculpe por ter esquecido deste tópico. :blush: Você poderia postar o seu SQL como está nesta última situação? Abraços
-
se você fizer uso da função da API - OpenFile, basta usar OF_SHARE_EXCLUSIVE no parâmetro uStyle. Sintax - veja em Help->Windows SDK para mais detalhes: HFILE OpenFile( LPCSTR lpFileName, // pointer to filename LPOFSTRUCT lpReOpenBuff, // pointer to buffer for file information UINT uStyle // action and attributes ); Se fizer uso de TFileStream, então use fmShareExclusive como parâmetro na instanciação da classe (chamada ao método Create). Veja se o que está a partir deste post serve para isto. Mais detalhes sobre NetFileEnum (ref. msdn) Abraços ___________ Corrigido link NetFileEnum
-
Note que ao invés de ele juntar os registros de BLU e SPO ele não juntou....ta separando...também parece que está em ordem crescente, e não decrescente como seria esperado. você adicionou os campos (fields) ao componente QUERYTodas? O Campo Unidade está na lista de fields? Vou ficar devendo, porque não trabalho com o Freereport. Espero que outro colega possa lhe ajudar com isto. Do contrário, avalie a possibilidade do arquivo temporário. Abraços
-
José, receio que de modo similar, você teria que organizar a seqüência de bits de modo a formar bytes a serem enviados para a serial. A escrita em si, na serial, pode ser feita através de algum componente para este fim (se não me engano, você já utilizou um) ou tratando a COM1 como um arquivo (veja exemplo: Basic Serial Communications In Delphi). Abraços
-
(Resolvido) Tratando ReceiveText() -Socket - Delphi
pergunta respondeu ao Jhonatas araujo de Micheus em Delphi, Kylix
Jhonatas, isso tá muito confuso... :wacko: Estes procedimentos: No Client: O Button1 no Form2, usa o ClientSocket1 (Form1) para enviar o texto em Memo2 (Form2) que em seguida é limpo (Memo2.Clear). No Server: Button1 no Form2, usa o ServerSocket1 (Form1) para enviar o texto em Memo2 (Form2) que em seguida é limpo (Memo2.Clear). Não me parecem ter o menor sentido, se levar em conta que supostamente o que você pretende processar seria uma mensagem que viesse com os textos: '01', '02', '03',..., conforme está no seu código. A questão é que o que você envia de um lado, deve ser o esperado do outro - pelo menos para ter uma finalidade de controle/interpretação de comandos. Sugiro que comece com algo simples, como os exemplos que já postei aqui no forum, onde você tem apenas um form. Entenda o mecanismo primeiro e depois vá adicionando mais elementos. Abraços -
Cadu0220, parece estranho mesmo. Utilizando o MySQL Query Browser e MySQL v. 5.1.22, eu executo uma consulta fazendo uso de CASE sem qualquer problema. Qual a mensagem que você recebe agora, que não tem o END CASE (no 1º erro) e que colocou o END (do case, 2º erro) ? Abraços
-
Felipee, utilize uma banda Detail e duas SubDetail. Na propriedade DataSet do QuickRep coloque o dataset (query) que traz os dados da NF, e na banda detalhe coloque os campos a serem mostrados. Faça duas outras consultas (queries), uma para itens da nf e outra para os itens da parcela. Estas consultas são vinculadas a NF através do uso da parametrização na cláusula WHERE. Ficariam mais ou menos assim: select * from nf where .... select * from itm where itm.codnf = :codnf order by itm.coditm select * from parc where parc.nf = :codnf Nestes dataset, você seta a propriedade DataSource para o datasouce que você deve ligar ao dataset da NF. Cada um destes dois datasets, será ligada a respectiva Sub-Detail via propriedade DataSet; Feito isto, basta abrir os 3 datasets e mostrar o relatório (quickRep1.ShowPreview). É por aí. Abraços
-
... if InputQuery('Digite o Dia para recebimento','Impressão para Recebimento em casa',Texto) then begin if ExisteInt(Texto) then begin Dia := StrToInt(Texto); if not (Dia in [1..31]) then begin ShowMessage('Dia tem quer de 1 até 31!'); exit; end; end else ShowMessage('Dia inválido!'); Exit; end; end ... Abraços
-
Parece que eu já havia falado algo sobre isto antes:
-
Ramon, vamos esclarecer esta sua afirmação:"(...) ele me mostra a Id e não a Descrição!", é este o problema a que você se refere quando escreveu: "(...) mais memo assim não adiantou, o primeiro código que você me passou funcionou perfeitamente, amas esse que seria para selecionar todos os campos não adiantou !" É que "(...)mas esse que seria para selecionar todos os campos não adiantou !", sugere que a consulta deu erro ou algo assim. Voce poderia informar a mensagem de erro caso tenha havido? O C.* trará todos os campos da tabela (a de clientes) cujo alias (apelido) chamamos "C". Entre todos estes campos estará, é claro, o campo Id do cliente, mas a descrição do status virá do campo buscado na tabela de status através do JOIN e, como eu disse antes, nós renomeamos o campo status retornado via join para DscStatus para evitar erro na execução da querie porque sua tabela de cliente já tem um campo com este nome. Talvez fosse conveniente você colocar o seu comando SQL aqui para avaliação. Informe também se você adicionou os campos (fields) ao seu dataset (componente TZQuery) em design-time. Abraços