Ir para conteúdo
Fórum Script Brasil

paulobergo

Membros
  • Total de itens

    295
  • Registro em

  • Última visita

Tudo que paulobergo postou

  1. Olá! Se você está querendo aproveitar tabelas do dBaseIII, Fox ou Clipper... 1) Se você quer (insistir) em usar tabelas DBF com índices NTX no Delphi, terá que usar um componente que "traz" a tecnologia NTX da CA para o Delphi... dentre todas as que experimentei, a única que funcionou foi a Halcyon (5 e 6); 2) Se você quer (insistir) em usar tabelas DBF com índices CDX no Delphi, não há dificuldades, pois os estes índices são perfeitamente aceitos (defina as tabelas como do tipo FoxPro); neste caso, há um bug na gravação de dados quando você usa uma query (sql) e que inclui, na cláusula "where", uma coluna que seja a chave de um índice... este bug faz o processador levar um tempão para gravar um registro quando levaria centesimos de milesimos de segundo... 3) Se você quer (finalmente) ter paz e ficar satisfeito com suas tabelas DBF, passe a acessá-las como sendo do tipo dBASE (Visual dBase), com índices MDX... Meus programas em Clipper e FoxPro, que estão mantidos no passado, permanecem com suas respectivas tabelas com índices NTX e CDX Nos programas atuais, em Delphi, uso as tabelas dBase com índices MDX... Os meus programas em Clipper acessam estas tabelas apenas para pesquisa, ou seja, nada de alterar, excluir ou incluir informações com eles... sem contar que só consegue abrir tabelas simples... as que usam campos especiais (como timestamp ou autoinc) não são aceitas pelas aplicações Clipper... aí, só no Delphi mesmo... Ok? Espero ter ajudado!
  2. Sobre o Comport do Dejan, o usu é simples... basta monitorar o que "cai" na serial... Se você colocou um componente no seu form (por exemplo, GPS = TComPort), observe seu evento OnRxChar... StrComB := 'COM2'; Count := 0; GPS.ReadStr(StrComB, Count); sDados := sDados+StrComB; {sDados é uma variável global, que vai acumulando toda a leitura serial até encontrar um CR} iPosCr := Pos(CHR(13),sDados); IF iPosCr>0 then Begin ShowMessage('Recebi isto pela serial: '+sDados+'!'); {Aqui, faço o que quiser com o conteúdo recebido e depois esvazio a variável sDados} End; {EndIf iPosCr>0} Cuidados com as seriais... Como citei anteriormente, uso o componente em situações críticas... por exemplo, o mesmo programa lê uma porta que recebe uma informação por segundo (de um GPS Etrex Garmin) e até doze informações por segundo (de um Odômetro NiteStar)... O fato é que eles não param de enviar as informações... Assim, o programa precisa ficar lendo os dados o tempo todo, para não perder informação... Então, principalmente no caso do odômetro, os dados chegam de forma muito variada, com vários blocos numa mesmo strintg... mais ou menos assim: velocidade+distância+cr+velocidade+distància+cr+velocidade distância+cr+velocidade+distância+cr+velocidade+distância+cr+velocidade+distância cr+velocidade distância+cr+velocidade+distância+cr Então, preciso manter aquela variável global (sdados) bem controlada, pois não processo todo o seu conteúdo de uma só vez... Já quando utilizamos o componente para uma leitura estática (por exemplo, leitura da pesagem da balança conectada ao pdv em um mercado), é mais simples, pois vou "ler" somente uma string, de uma só vez, processar seu peso ou valor e pronto... Então, muito cuidado quando a leitura pela serial for de um fluxo contínuo de informações... Ok?
  3. Não faz... Você deverá formatar a linha a ser impressa, montando cada coluna da forma como desejar, completando com espaços ou "zeros" as strings referentes aos campos dos registros... 1) Procure, nos foruns e outros sites, uma função que completa com espaços ou zeros uma string, tanto à direita, como à esquerda, e que, de quebra, possa, também, centralizar uma string; 2) Use estas funções para montar as suas strings a serem impressas. Imagine uma lista simples, com o nome do apresentador e sua renda, e que você precise imprimir esta lista bem formatada: sNome[1] := 'FAUSTO'; sNome[2] := 'RATINHO'; sNome[3] := 'SILVIO SANTOS'; sNome[4] := 'CELSO FREITAS'; sNome[5] := 'TOM CAVALCANTI'; vRenda[1] := 25000; vRenda[2] := 5000; vRenda[3] := 50000; vRenda[4] := 10000; vRenda[5] := 3500; WriteLn(ftOutFile,' Nome do Sujeito ',' Renda R$ '); WriteLn(ftOutFile,'------------------------------','-------------'); Nome[1]+' '+FormatFloat('###,###,##0.00',vRenda[1]); WriteLn(ftOutFile,sNome[1]+' '+FormatFloat('###,###,#0.00',vRenda[1])); WriteLn(ftOutFile,sNome[2]+' '+FormatFloat('###,###,#0.00',vRenda[2])); WriteLn(ftOutFile,sNome[3]+' '+FormatFloat('###,###,#0.00',vRenda[3])); WriteLn(ftOutFile,sNome[4]+' '+FormatFloat('###,###,#0.00',vRenda[4])); WriteLn(ftOutFile,sNome[5]+' '+FormatFloat('###,###,#0.00',vRenda[5])); O código acima vai produzir um resultado ruim, sem formatação... Então, Você precisa: a) Completar com espaços, à direita, os nomes, até o total de 30 (trinta) espaços... B) Completar com espaços, à esquerda, os valores, até o total de 13 (treze) espaços... Considerando que você crie uma função que faça isso, que essa função tenha o nome de "Complete", e que aceite, como parâmetros, a string, o tamanho desejado e a quantidade de espaços, você deveria usar isso: WriteLn(ftOutFile,' Nome do Sujeito ',' Renda R$ '); WriteLn(ftOutFile,'------------------------------','-------------'); WriteLn(ftOutFile,Complete(sNome[1],30,'D')+' '+Complete(FormatFloat('###,###,#0.00',vRenda[1]),13,'E')); WriteLn(ftOutFile,Complete(sNome[2],30,'D')+' '+Complete(FormatFloat('###,###,#0.00',vRenda[2]),13,'E')); WriteLn(ftOutFile,Complete(sNome[3],30,'D')+' '+Complete(FormatFloat('###,###,#0.00',vRenda[3]),13,'E')); WriteLn(ftOutFile,Complete(sNome[4],30,'D')+' '+Complete(FormatFloat('###,###,#0.00',vRenda[4]),13,'E')); WriteLn(ftOutFile,Complete(sNome[5],30,'D')+' '+Complete(FormatFloat('###,###,#0.00',vRenda[5]),13,'E')); Ok?
  4. Olá... Muito estranho essa questão do HT... Os computadores que usam meus programas são P4 3200 ht e não têm problema de lentidão em condições extremas (funcionam embarcados em carros, lendo as três seriais - a da placa-mães e duas adicionais da Naxos, filmando as vias - estradas, rios ou ferrovias - com o MovieMaker e ainda alimentando um banco de dados de ocorrências com informações digitadas por um engenheiro)... Nunca precisei desativar o HT... Apenas lembro que, em 2003, quando desenvolvi o software, nunca consegui "rodar" o sistema em notebooks com adaptadores "usb-serial"... foram necessárias portas seriais de verdade... O componente serial que utilizo é o ComportLibrary 2.64 (Dejan Crnila)... http://sourceforge.net/projects/comport/ Ok?
  5. Olá... Bom, tenho muitas rotinas de leitura e gravação nas portas seriais... numa delas, por exemplo, preciso acessar um GPS (que fornece uma informação por segundo) em uma serial e um odômetro digital (que fornece 12 informações por segundo) em outra serial, ao mesmo tempo em que leio um dispositivo indicador (tipo um mouse) em outra serial... Se você já verificou as configurações das portas, desabilitou o controle do hardware pelo Windows (se o seu software acessa as portas diretamente), pode ser necessário segmentar o programa, usando um "steper"... Assim, cada chamada (leitura ou gravação) na serial precisa estar em um segmento específico dentro de um laço, que controla o ínicio e o fim de cada pequena tarefa, de modo a você poder saber qual tarefa está tomando mais tempo do processamento... este tipo de aplicãção funciona como o protocolo tokenring, no qual cada terminal tem uma espécie de "senha" para desempenhar uma tarefa no loop (o "anel" circular) da rede... Por falar em processamento, também é importante monitorar a máquina, eliminando processos desnecessários (tipo, monitoramento de novos dispositivos USB, p.e.)... Ok?
  6. 1) Criando uma tabela; create table 'teste_numero.dbf' ( numero numeric(10,2) ) 2) Inserindo dados nesta tabela: insert into 'teste_numero.dbf' (numero) values (0.25) 3) Isso gera um erro, por causa da vírgula: insert into 'teste_numero.dbf' (numero) values (0,25) 4) Mas isso dá certo: insert into 'teste_numero.dbf' (numero) values (:valor) se eu definir valor como, por exemplo, AsFloat nos parametros da query, que pode receber, por exemplo, o valor informado em um Edit, com a vírgula mesmo... Seria por aí sua dúvida?
  7. Vejamos... Segue um exemplo... Digamos que eu tenha uma lista de grupos de animais perigosos e que tenha uma lista com varios elementos dentro desses grupos... Os arquivos foram criados no DbExplorer, e as tabelas são dbf (Visual dBase7), em um alias temporario, com o nome "temp". // ************************************* Criando a tabela dos grupos: create table 'animais_perigosos_grupo.dbf' ( grupo char(3), titulo char(20) ) Inserindo os dados: insert into 'animais_perigosos_grupo.dbf' (grupo, titulo) values ('001','Escorpiao') insert into 'animais_perigosos_grupo.dbf' (grupo, titulo) values ('002','Cobra') insert into 'animais_perigosos_grupo.dbf' (grupo, titulo) values ('003','Jacare') insert into 'animais_perigosos_grupo.dbf' (grupo, titulo) values ('004','Tubarao') Verificando os dados inseridos: select * from 'animais_perigosos_grupo.dbf' // ************************************* Criando a tabela com os detalhes sobre os bichos: create table 'animais_perigosos_detalhe.dbf' ( gr char(3), codigo char(6), descricao char(20), informacao char(80) ) Inserindo as informações detalhadas: Insert into 'animais_perigosos_detalhes.dbf' (gr, codigo ,descricao, informacao) values ('001', '001001', 'EscorpiaoRei', 'Escorpiao que vive no deserto, muito venenoso') Insert into 'animais_perigosos_detalhes.dbf' (gr, codigo ,descricao, informacao) values ('001', '001002', 'EscorpiaoEremita', 'Escorpiao que vive sozinho e é pouco venenoso') Insert into 'animais_perigosos_detalhes.dbf' (gr, codigo ,descricao, informacao) values ('001', '001003', 'EscorpiaoPraiano', 'Escorpiao que vive nas areias das praias do Espirito Santo e é muito venenoso...') Insert into 'animais_perigosos_detalhes.dbf' (gr, codigo ,descricao, informacao) values ('001', '002001', 'Cascavel', 'Cobra barulhenta, muito comum aqui perto de Juiz de Fora... etc... etc...') Insert into 'animais_perigosos_detalhes.dbf' (gr, codigo ,descricao, informacao) values ('001', '002002', 'Coral', 'Cobra terrível, muito bonita, e das cores do Flamengo...') Insert into 'animais_perigosos_detalhes.dbf' (gr, codigo ,descricao, informacao) values ('001', '002003', 'CoralFalsa', 'Cobra inofensiva e que não devia estar nesta lista...') Insert into 'animais_perigosos_detalhes.dbf' (gr, codigo ,descricao, informacao) values ('001', '002004', 'UrutuCruzeiro', 'Cobra que tem uma cruz na cabeça... ela dá o bote mortal e já encomenda a alma...') Insert into 'animais_perigosos_detalhes.dbf' (gr, codigo ,descricao, informacao) values ('001', '003001', 'JacaredoPantanal', 'Jacare pequeno, mas muito agressivo... adora comer patos e tuiuiussssssss ai...') Insert into 'animais_perigosos_detalhes.dbf' (gr, codigo ,descricao, informacao) values ('001', '003002', 'JacaredoTchan', 'Jacare criado, que participa de programas de televisão... não é perigoso (acho)...') Insert into 'animais_perigosos_detalhes.dbf' (gr, codigo ,descricao, informacao) values ('001', '003003', 'Jacareacanga', 'Jacare estampado em peças femininas (canga)... não devia estar nesta lista...') Insert into 'animais_perigosos_detalhes.dbf' (gr, codigo ,descricao, informacao) values ('001', '004001', 'Tubaraomartelo', 'Tubarao muito agressivo.') Insert into 'animais_perigosos_detalhes.dbf' (gr, codigo ,descricao, informacao) values ('001', '004002', 'Tubaraobranco', 'Tubarao que come, inclusive, peças de automoveis.') // ************************************* Contando quantos itens existem em cada grupo. Crie um arquivo texto, com extensão ".sql", com a query que "conta" quantos itens existem em cada grupo; Por exemplo, salve essa "query" em c:\temp\Qgrupos.sql: select count(gr) qpaginas, gr dogrupo from 'animais_perigosos_detalhe.dbf' group by gr continua... Continuação... // ************************************* Juntando a "contagem" com os dados dos bichos select * from 'animais_perigosos_grupo.dbf' grupos inner join 'animais_perigosos_detalhe.dbf' detalhe on (grupos.grupo=detalhe.gr) inner join 'c:\temp\Qgrupos.sql' Qgrupos on (grupos.grupo=Qgrupos.dogrupo) order by grupo, descricao // ************************************* Teremos uma lista ordenada, com os doze registros (portanto, doze folhas serão impressas); a quantidade de registros de cada grupo vai estar na coluna (campo) qpaginas: Se desejo o seguinte resultado: Folha Conteudo 01 EscorpiaoEremita "Página 1/3" 02 EscorpiaoPraiano "Página 2/3" 03 EscorpiaoRei "Página 3/3" 04 Cascavel "Página 1/4" 05 Coral "Página 2/4" 06 CoralFalsa "Página 3/4" 07 UrutuCruzeiro "Página 4/4" 08 Jacareacanga "Página 1/3" 09 JacaredoTchan "Página 2/3" 10 JacaredoPantanal "Página 3/3" 11 Tubaraobranco "Página 1/2" 12 Tubaraomartelo "Página 2/2" Sendo: Var sGrupoAtual: String iPaginaAtual: Integer, ftOutFile: TextFile; // ******** Posso criar um arquivo-texto, com os dados desejados: Begin Assign(ftOutFile,'c:\temp\lista.txt'); ReWrite(ftOutFile); With query do Begin Open; First; sGrupoAtual := FieldByName('gr').AsString; iPaginaAtual := 1; While not eof do Begin WriteLn(ftOutFile,'Pagina '+IntToStr(iPaginaAtual)+' de '+FieldByName('qpaginas').AsString); WriteLn(ftOutFile,'Grupo: '+FieldByName('grupo').AsString); WriteLn(ftOutFile,'Descricao: '+FieldByName('descricao').AsString); WriteLn(ftOutFile,'Destalhes sobre o bicho: '+FieldByName('informacao').AsString); Write(ftOutFile,chr(12)); Next; If FieldByName('gr').AsString<>sGrupoAtual then Begin sGrupoAtual := FieldByName('gr').AsString; iPaginaAtual := 1; End; {EndIf FieldByName...} End;{While not eof} End;{With query} CloseFile(ftOutFile); End; Ok? Espero ter ajudado!
  8. Oi pessoal... Desenvolvi um pequeno aplicativo (cgi ou isapi), para simplesmente criar uma figura (um bitmap) de um código de barras no padrão itf (2by5 interleaved)... Com um form normal, consigo gravar a imagem do código de barras (meu objetivo é imprimir o código da febraban ou qualquer outro que use o padrão '2 de 5 intercalado') como jpeg... No entanto, a aplicação (o código simplificado encontra-se a seguir) precisa rodar sob a Intranet, em uma aplicação CGI (executável) sob o IIS no XP... e gravando como BMP dá certinho... só não consigo salvar como jpeg... O código é este: Unit cgi2by5unit; {*********************************************************************** Executável (cgi) para geração de uma imagem de códigos de barras no padrão 2 de 5 intercalado (interleaved 2by5) ************************************************************************} interface uses SysUtils, Classes, HTTPApp, HTTPProd, JPEG, QExtCtrls, QGraphics; type TWebModule1 = class(TWebModule) PageProducer1: TPageProducer; procedure WebModule1WebActionItem1Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); procedure PageProducer1HTMLTag(Sender: TObject; Tag: TTag; const TagString: String; TagParams: TStrings; var ReplaceText: String); private { Private declarations } public { Public declarations } end; Var WebModule1: TWebModule1; sITFMask: Array[0..9] of String; sBitFase: String; Const cr = chr(13); lf = chr(10); sBarraF = '1'; // Barra preta, "fina" sSpaceF = '00'; // Barra branca, "fina" sBarraG = '1111'; // Barra preta, "larga" sSpaceG = '0000'; // Barra branca, "larga" Implementation {$R *.DFM} Function sBar2by5(sCbCodi: String): String; Var sBit, sGetPA, sGetPB, sMaskA, sMaskB, sCodeBar: String; iGetcol, iCodA, iCodB, iItf, iItfstep: Integer; iPos, iY0, iY1, iX0, iX1: Integer; jp: TJPEGImage; Image: TBitmap; sTempFile: String; jpeg: TJPEGImage; bmp: TBitmap; Begin // A variável sBitFase é usada apenas para saber onde está ocorrendo erro. Image := TBitmap.Create; sBitFase := '1'; Image.Width := 1024; sBitFase := '2'; Image.Height := 80; sBitFase := '3'; // Image.Picture.Graphic := Bitmap; sBitFase := '4'; // Image.Picture.Graphic := Image; sBitFase := '5'; sCbCodi := TRIM(sCbCodi); // *********** Montagem de uma "imagem" do código, com "zeros" e "uns". Início. sBitFase := '6'; sCodeBar := sBarraF+sSpaceF+sBarraF+sSpaceF; iITF := 1; While iITF<=Length(sCbCodi) do Begin iCodA := StrToInt(Copy(sCbCodi,iITF ,1)); iCodB := StrToInt(Copy(sCbCodi,iITF+1,1)); sMaskA := sITFMask[iCodA]; sMaskB := sITFMask[iCodB]; iGetCol := 1; While iGetCol<=5 do Begin sGetPA := Copy(sMaskA,iGetCol,1); sGetPB := Copy(sMaskB,iGetCol,1); sCodeBar := sCodeBar+IIF(sGetPA='1',sBarraG,sBarraF)+ IIF(sGetPB='1',sSpaceG,sSpaceF); Inc(iGetCol); End;{While iGetCol<=5} iITF := iITF+2; End;{While iITF<=Length(sCbCodi)} sCodeBar := sCodeBar+sBarraG+sSpaceF+sBarraF; // *********** Montagem de uma "imagem" do código, com "zeros" e "uns". Fim sBitFase := '7'; iY0 := Image.Height-5; iY1 := 5; iX0 := 10; iX1 := 0; iPos := 1; While iPos<=Length(sCodeBar) do Begin sBit := Copy(sCodeBar,iPos,1); If sBit='1' then Begin Image.Canvas.MoveTo(iX0,iY0); Image.Canvas.LineTo(iX0,iY1); End; {EndIf} Inc(iX0); Inc(iPos); End;{While iPos<=Length(sCodeBar)} Image.SaveToFile('c:\temp\figura.bmp'); { ********** Parte que só funciona em um Form. Início. Toda essa parte do código, que funciona com um form comum, não funciona no webmodule } { sBitFase := '8'; jp := TJPEGImage.Create; Try With jp Do Begin sBitFase := '9'; Assign(Image); // passa o conteúdo do Comp. Image para o Comp. Jp sBitFase := '10'; sTempFile := 'c:\temp\barcode.jpg'; sBitFase := '11'; SaveToFile(sTempFile); End;{With jp} {Finally jp.Free; Image.Free; End; { ********** Parte que só funciona em um Form. Fim. } sBar2by5 := sBitFase; End; Procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); Var iItens, iItem, iPos: Integer; bModoPost: Boolean; sCodigo2Barras, sString, sParteDir, sParteEsq: String; Begin iItens := Request.ContentFields.Count; bModoPost := iItens>0; If not bModoPost then iItens := Request.QueryFields.Count; {EndIf} sITFMask[0] := '00110'; sITFMask[1] := '10001'; sITFMask[2] := '01001'; sITFMask[3] := '11000'; sITFMask[4] := '00101'; sITFMask[5] := '10100'; sITFMask[6] := '01100'; sITFMask[7] := '00011'; sITFMask[8] := '10010'; sITFMask[9] := '01010'; iItem := 1; While iItem<=iItens do Begin If bModoPost then sString := Request.ContentFields.Strings[iItem-1] Else sString := Request.QueryFields.Strings[iItem-1]; {EndIf} iPos := Pos('=',sString); sParteEsq := Copy(sString,1,iPos-1); sParteDir := Copy(sSTring,iPos+1,Length(sString)-iPos); If sParteEsq='i2by5' then Begin sCodigo2Barras := sParteDir; sBar2By5(sCodigo2Barras); End; {EndIf} Inc(iItem); End;{While iItem<=iItens} Response.Content := '<html>'+ 'O código é '+sCodigo2Barras+'<br>'+ '<img src="c:\temp\figura.bmp">'; Response.Content := Response.Content+ PageProducer1.Content; Response.Content := Response.Content+'</html>'; End; Procedure TWebModule1.PageProducer1HTMLTag(Sender: TObject; Tag: TTag; const TagString: String; TagParams: TStrings; var ReplaceText: String); Var sCode2Convert: String; Begin If Copy(TagString,1,6)='cidade' then ReplaceText := 'Juiz de Fora-MG'; {EndIf} End; End. Instalando o executável na pasta scripts do IIS, basta passar esta url para obter um código. Por exemplo: url=http://meuservidor/scripts/cgi2by5.exe?i2by5=001122&cidade=Belo%20Horizonte Isso iria gerar o código de barras para 001122 (usar sempre quantidade par de algarismos)... Grato!
  9. Direto do meu XP, imprimindo tanto para a porta como para uma impressora da rede... Ok?
  10. Oi. Parece que o problema é de conceito... na verdade você não quer numeração de páginas... você quer numeração de registros... Assim, você não usará a paginação do QuickReport (pois terá uma numeração de páginas sequencial, que não interessa a você)... Então, a solução é preparar previamente a numeração que você precisa (que não é de páginas)... colocando, em um outro campo da própria tabela (ou uma tabela temporária) a numeração que deve sair em cada folha... Ok?
  11. Olá... Veja só... eu há muito tempo (desde o Delphi3) uso cgi e isapi, tanto nas aplicações totalmente web como nas mistas (forms com gravação e recuperação de dados com TTable e TQuery e cgi's e isapi's). Durante este tempo, nunca consegui usar o método Post nas ISAPIs (dll's) e CGIs (exe's), quando eu escrevia diretamente a chamada diretamente na URL (um simples link em página htm mesmo)... ou seja, só coseguia usar o método POST diretamente nos botões "submit" dos forms... Assim, toda vez que preciso fazer, por exemplo, uma pesquisa num banco de dados, através dos meus programas rodando sob o IIS ou Personal Web (XP e 98 respectivamente), uso GET. De qualquer forma, vou pesquisar mais... Ok?
  12. Não ajudou muito... Pode dar um exemplo? Viu "CurrentReadBuffer" e "CurrentReadBufferSize" no componente?
  13. Veja: Isso funciona nas impressoras "Datamax" e Argox (Beetle da Metrologic e Rabbit)... Quem sabe funcione na Epson! P.Bergo
  14. Olá. Olha, depois de penar muito com modelos de impressão, optei por dois processos: 1) Consultas ou Relatórios que podem ser impressos em impressoras jato de tinta e laser, uso o WebBrower, e o usuário tem a opção de consultar apenas no navegados os dados que precisa ou pode fazer sua impressão em qualquer impressora que desejar (principalmente as não-matriciais); 2) Relatórios, notas fiscais, recibos, promissórias, carnês, relatórios fiscais (registro de entrada, saída, livro-caixa, etc - que obrigatoriamente, por lei, só podem ser feitos em matriciais), uso o Canvas do TPrinter... e funciona com qualquer impressora. Gostaria de saber mais sobre esses métodos? Poste aqui e então colocarei exemplos... Ok?
  15. Olá! Como o amigo reportou, as impressoras térmicas geralmente não aceitam uma impressão "direta", como você está tentando... Eu trabalho com impressoras térmicas como Aleggro e Beetle e nenhuma delas aceita impressão direta... temos que enviar um monte de código para fazê-las funcionar... Veja este exemplo, de imagem de um códigos de barras: Tudo isso para impressão de uma simples etiqueta com código de barras para prateleira de supermercado... Creio que na Epson haverá um esquema como esse... Ok?
  16. Olha... o melhor que você tem a fazer é usar a dll "oficial" do Sintegra. Pegue aqui: http://www.sintegra.gov.br/DLL3.zip E' super fácil de incluir na sua aplicação! Ok?
  17. Olá! Eu já passei por esta situação de várias formas... em Delphi (usando o SQL da BDE com tabelas .dbf Visual dBase e também tabelas .dbf do Visual FoxPro e .db Paradox) e em Clipper, com tabelas .dbf do próprio Clipper (com índices .ntx - CA e índices .mdx - Visual dBase) . Hoje, uso campos tipo autoincremento nas tabelas manipuladas pela BDE (SQL em Delphi). Por exemplo, três usuários iniciam o cadastro de uma nova ficha de cliente, exatamente ao mesmo tempo, em uma aplicação de televendas por exemplo... os três recebem uma ficha em branco com o mesmo número (o último número + 1); por exemplo: 09842. Considerando que apenas dois usuários concretizem os pedidos que estão negociando e confirmem os dados das fichas que abriram, ambos irão gravar seus registros, através de uma query, como esta: insert into 'cadcli.dbf' (nome,endereco,municipio,uf,telefone,cpf) values ('joao','rua a 448','juiz de fora','mg','3232-4422','58748429233') Em seguida, o programa localiza o registro novo pelo cpf ou cnpj (permitidos somente um deles na tabela, sendo que antes de ser iniciado um novo cadastro o sistema verifica se não existe um registro com aquele cpf ou cnpj). select codigo from 'cadcli.dbf' where cpf='58748429233' e mostra para o usuario o codigo correto atribuido à sua ficha e ele pode confirmar o resto de sua operacao... Em Clipper, utilizei (e utilizo) o "travamento externo". Esse modo consiste na gravação de um arquivo texto pelo usuário que está "salvando" os seus dados... Este arquivo permanece bloqueado até o término da gravação... então, o outro usuário (ou outros usuários) vão gravando seus dados, sequencialmente... Neste caso, uma função tenta abrir o arquivo que controla a numeração... Se conseguir, verifica o próximo número e trava o arquivo, enquanto grava os dados do cliente no banco de dados... Ao final, fecha o arquivo, que fica liberado para outro usuário... Preferi usar estes métodos para não ter que me preocupar com os travamentos de arquivos na hora de gravar informações... Uso o SQL para praticamente tudo, inclusive para os antigos programas em Clipper, e sempre com tabelas Visual dBase (índices com múltiplas chaves em um só arquivo .MDX). Espero ter ajudado!
  18. Oi pessoal. Tenho um form que remete para um script. Preciso substuir o evento onSubmit por um elemento que permita substituir o form por uma url. Vejam: Substituir: <form action="loja/managecart.html" onSubmit="DefCli(this);"> <input type="text" name="CLFICH" maxlength="05"> <input type="text" name="CLNOME" maxlength="40"> <input type="submit" name="confirma" value="OK"> </form> por algo assim: <a href="loja/managecart.html?onSubmit=DefCli(this);&CLFICH=00200 &CLNOME=PAULO&confirma=OK">PAULO (00200)</a> Detalhe: managecart.html é uma página que contém várias funções, sendo, uma delas, a função DefCli, que nada mais é do que uma função para gravar dois cookies para identificação do cliente em um pedido (pré-venda)... Como a seleção do cliente é feita através de uma consulta em SQL, eu tenho vários clientes por página e bastaria apenas clicar no nome dele para selecioná-lo, não precisando de um botão de formulário... Será que também há uma forma de trocar um botão no form por um clique em um nome ou outro campo? isto também resolveria... Grato por qualquer ajuda!
  19. Oi! Antes disso, eu, depois de quebar muito a cabeça, encontrei o pacote de instalação das extensões do Frontpage para o Kurumin no programa Synapts... Fiz a instalação (roteiro abaixo) mas parece que ainda não deu certo. Vejam: Botão K (iniciar) * Centro de Controle do Kurumin Icones Magicos Avançado: Instalar e gerenciar os programas instalados usando o Synaptic * Gerenciador de Pacotes Synaptic Procurar "frontpage" Viva! na lista do lado esquerdo (que não tem título), aparece o nome "frontpage" e Na tabela da esquerda aparece o Pacote "libapache-mod-frontpage-mirfak", sem "Versão Instalada", "Versão Recente"="1.6.2-11" e "Descrição"="Frontpage support for apache". Então, vamos... Marcamos para instalacao: "Marcar mudanças adicionais requeridas?" "A serem instalados", marcamos "apache-common" e clicamos no botão "Marcar". Surge a mensagem: "Frontpage support for apache. This package contais the module... <http://www.rtr.com/fpsupp.." sendo este último o link que contém sempre as versões mais recentes das extensões do frontpage para diversas distribuições do Linux, Unix, etc... Agora, seguindo: Clicamos no botão Aplicar (no topo da tela do Synaptic), para "Aplicar todas as mudanças marcadas". Surge uma janela "Resumo"... "Essa é a sua última oportunidade de verificar a lista de mudanças..." Contém um aviso de que o software que você vai instalar não pode ser autenticado... No centro da janela, aparecem três linhas, sobre os pacotes selecionados.: "NÃO AUTENTICADO" "A serem instalados" "Não modificados" Ao selecionar uma dessas linhas e clicar no botão "Mostrar Detalhes", poderemos saber quais são os pacotes referentes a essas escolhas... Continuando... clicamos no botão Aplicar (agora, em baixo na tela)... Inicia-se o download dos pacotes... parece que os links estão ok! Infelizmente, não foi possível saber de onde estava sendo feito o download. Arquivo 1(de 2) ok! Não foi possível ver o download do arquivo 2 (deve ter sido muito rápido)... Surge a janela "aplicando Modificações... Instalando software... Configuring apache... installed lib apache... tudo muito rápido!" Finalmente, temos a mensagem "Mudanças aplicadas". Todas as modificações aplicadas com sucesso. Você pode fechar a janela agora. Vamos ver... será que deu certo? Fechamos a janela... aparentemente, haverá um retorno para o próprio programa Synaptc... Isso. O pacote "libapache-mod-frontpage-mirfak" aparece com um ícone verde... Fechamos o Synaptic (arquivo, sair). Fechamos os Ícones mágicos (botão fechar). Vamos para uma máquina com XP. Abrimos o Frontpage2000. Arquivo Abrir Web. url: http://192.168.0.44/bovinajf Nada feito... A pasta "http://192.168.0.44" não está acessível. Ela pode estar em um volume não disponível ou protegida por uma senha. Para obter detalhes, consulte C:\DOCUME~1\Paulo\CONFIG~1\Temp\wecerr.txt Abrimos o documento, que contém: 06/20/2006 10:02:53 HTTP 404 Not Found <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>404 Not Found</title> </head><body> <h1>Not Found</h1> <p>The requested URL /_vti_bin/shtml.exe/_vti_rpc was not found on this server.</p> <hr> <address>Apache/2.0.55 (Debian) PHP/4.4.2-1+b1 Server at 192.168.0.44 Port 80</address> </body></html> Agora, vamos tentar a boa e velha prática de reininiciar... Reiniciado o computador, tentamos abrir a página pelo Frontpage... Linux Reiniciado... Voltamos para o XP, abrimos o Frontpage e tentamos abrir a mesma web... mas o resultado foi o mesmo... Então... - Como saber se as extensões do frontpage foram realmente instaladas? - E´ preciso fazer alguma configuração adicional nos arquivos do Apache? Gratos por qualquer colaboração!
  20. Aí vai! http://www.rtr.com/fpsupport/download.htm Abra o link das extensões na versão 5. Veja que haverá uma lista de opções, de acordo com o s.o. instalado... eu tentei a versão Intel x86, para Linux 8.0 e 9.0 (Red Hat Software). Vou tentar o comando que você sugeriu! Grato!!! Em tempo... O item 2.4 Adding frontpage no HOWTOs do Linux.Com tem estas instruções: Rename the fp30.linux.tar.Z file to fp30.linux.tar.gz, otherwise the install script will not find it. Run ./fp_install to copy the extension files to /usr/local/frontpage. Zcat cant usually be invoked as /usr/bin/zcat. You now have to apply the FP patch. cd to /usr/src/apache_1.2.6/src and type patch < /usr/src/frontpage/version3.0/apache-fp/fp-path-apache_1.2.5 This will create the mod_frontpage.* files and do some modifications to Configuration etc. The 1.2.5 patch will work with both apache 1.2.5 and 1.2.6. Skip the part about installing webs, you can do that later. Traduzindo... Renomeie o arquivo fp30.linux.tar.Z para fp30.linux.tar.gz, do contrário o script de instalação não irá encontrá-lo. Execute ./fp_install para copiar os arquivos extendidos para /usr/local/frontpage. Zcat não pode ser geralmente chamado como /usr/bin/zcat. Você agora pode aplicar o "patche" do FP. Vá para (com cd) o diretório /usr/src/apache_1.2.6/src e digite patch < /usr/src/frontpage/version3.0/apache-fp/fp-path-apache_1.2.5 Isto irá criar os arquivos (do módulo) mod_frontpage.* e fazer algumas modificações na Configuração etc. O "patche" 1.2.5 irá funcionar tanto com o apache 1.2.5 como o 1.2.6. Pule as parter sobre instalação de webs, você pode fazer isto mais tarde. Ok?
  21. Ops... Você quer contar quantas vendas o vendedor fez ou totalizar as quantidades vendidas por ele??? Se você quer contar quantas vezes ele vendeu, use a função Count. Se deseja totalizar as quantidades (de cada NF, p.e.), use a funçao Sum. Veja a diferença: Na tabela de notas fiscais, o vendedor de código 1 tem estas vendas: Vendedor/Quantidade/Valor 1/100/85 1/155/180 1/21/34 1/44/44 1/123/677 1/412/562 Agora veja: select sum(quantidade) qtdetotal, sum(valor) valortotal, vendedor from 'vendas.dbf' group by vendedor Produzirá: qtdetotal/valortotal/vendedor 855/1582/1 Já select count(quantidade) quantasvendas, sum(valor) valortotal, vendedor from 'vendas.dbf' group by vendedor Produzirá: quantasvendas/valortotal/vendedor 1/1582/1 Ok? Só mais uma dica! Use o dbExplorer para experimentar estas queryes!!!
  22. Acho muito difícil... Os sistemas gerenciadores de bancos de dados existem exatamente para que não tenhamos que escrever códigos sobre a organização dos dados... Acho que seria mais prático criar um pequeno "servidor" sql para receber as requisições de leitura e gravação do seu programa... tipo assim um programa que fique esperando sempre os comandos para inserir, atualizar, excluir e consultar os dados, e que pode ser configurado como um serviço (em máquinas com NT, 2000, 2003, XP Pro) ou tarefa mesmo (win98)... Seu programa em TurboPascal pode criar um arquivo texto assim: AssignFile(ftOutFile,'c:\sql\joao\comando.sql'); ReWrite(ftOutFile); WriteLn(ftOutFile,'insert into '+chr(39)+':acme:produtos.db'+chr(39)) WriteLn(ftOutFile,'(codigoean, nome, preço)'); WriteLn(ftOutFile,'values'); WriteLn(ftOutFile,'('+chr(39)+'7890304840001'+chr(39)+','+chr(39)+'TODDYNHO'+CHR(39)+',1.99)'); CloseFile(ftOutFile); O seu programa "servidor-SQL" lê este arquivo, executa seu conteúdo e pode até gravar nele mesmo o resultado da query... Eu, se tivesse que escrever um programa em qualquer linguagem como o TbPascal, TurboBasic, Fortran, dBaseIII, etc... usaria, com certeza, este esquema... Ok?
×
×
  • Criar Novo...