Jump to content
Fivewin Brasil

Ariston Santos

Membros
  • Posts

    500
  • Joined

  • Last visited

  • Days Won

    11

Everything posted by Ariston Santos

  1. Olá. Eu uso as funções abaixo para gerar CC-e para Word e enviar por email. Adapte e testa aí. STATIC FUNCTION NfeCCeImp(_nRec) IF LEN(aNFeCCe) = 1 IF EMPTY(aNFeCCe[1,4]) SysRefresh() MsgAlert("Não existe Carta de Correção homologada para esta NF-e","Aviso") RETURN NIL ENDIF ENDIF aCampos := {} aadd( aCampos, { 'DATA', DataH(DATE(), .T., .F.) } ) aadd( aCampos, { 'DESTINATARIO', ALLTRIM(NFE_INFO->D_NOME) } ) aadd( aCampos, { 'ENDERECO', ALLTRIM(NFE_INFO->D_LOGR)+", "+ALLTRIM(NFE_INFO->D_NUME) } ) aadd( aCampos, { 'CIDUF', ALLTRIM(NFE_INFO->D_CIDA)+"-"+ALLTRIM(NFE_INFO->D_UF) } ) aadd( aCampos, { 'NFENR', ALLTRIM(STR(NFE_INFO->NFENUM)) } ) aadd( aCampos, { 'CHNFE', ALLTRIM(NFE_INFO->CCHAVE) } ) aadd( aCampos, { '01', " " } ) aadd( aCampos, { '02', " " } ) aadd( aCampos, { '03', " " } ) aadd( aCampos, { '04', " " } ) aadd( aCampos, { '05', " " } ) aadd( aCampos, { '06', " " } ) aadd( aCampos, { '07', " " } ) aadd( aCampos, { '08', " " } ) aadd( aCampos, { '09', " " } ) aadd( aCampos, { '10', " " } ) aadd( aCampos, { '11', " " } ) aadd( aCampos, { '12', " " } ) aadd( aCampos, { '13', " " } ) aadd( aCampos, { '14', " " } ) aadd( aCampos, { '15', " " } ) aadd( aCampos, { 'COD1', " " } ) aadd( aCampos, { 'COD2', " " } ) aadd( aCampos, { 'COD3', " " } ) aadd( aCampos, { 'COD4', " " } ) aadd( aCampos, { 'COD5', " " } ) aadd( aCampos, { 'COD6', " " } ) aadd( aCampos, { 'COD7', " " } ) aadd( aCampos, { 'COD8', " " } ) aadd( aCampos, { 'CORR01', " " } ) aadd( aCampos, { 'CORR02', " " } ) aadd( aCampos, { 'CORR03', " " } ) aadd( aCampos, { 'CORR04', " " } ) aadd( aCampos, { 'CORR05', " " } ) aadd( aCampos, { 'CORR06', " " } ) aadd( aCampos, { 'CORR07', " " } ) aadd( aCampos, { 'CORR08', " " } ) aadd( aCampos, { 'EMITENTE', ALLTRIM(mEmp) } ) aadd( aCampos, { 'RESPONSAVEL', ALLTRIM(cPnom) } ) cOutr := "" nOcor := 1 nL := _nRec * FOR nL := 1 TO LEN(aNFeCCe) cCorr := ALLTRIM(aNFeCCe[nL,4]) cItem := ALLTRIM(aNFeCCe[nL,5]) IF ! EMPTY(cCorr) nScn := ASCAN(aItmCCe, {|x|ALLTRIM(x[2])==cItem}) IF nScn > 0 .AND. nScn < 15 cFld := STRZERO(nScn,2) nPos := ASCAN(aCampos, {|y|y[1]==cFld}) IF nPos > 0 aCampos[nPos,2] := "X" nCrr := ASCAN(aCampos, {|z|z[1]=="COD"+STR(nOcor,1)}) IF nCrr > 0 ; aCampos[nCrr,2] := cFld ; ENDIF nTxt := ASCAN(aCampos, {|z|z[1]=="CORR0"+STR(nOcor,1)}) IF nTxt > 0 ; aCampos[nTxt,2] := cCorr ; ENDIF nOcor ++ ELSE IF ! EMPTY(cOutr) ; cOutr += "; " ; ENDIF cOutr += cItem+" -> "+cCorr ENDIF ELSE IF ! EMPTY(cOutr) ; cOutr += "; " ; ENDIF cOutr += cItem+" -> "+cCorr ENDIF ENDIF * NEXT IF ! EMPTY(cOutr) nPos := ASCAN(aCampos, {|y|y[1]=="15"}) IF nPos > 0 aCampos[nPos,2] := "X" nCrr := ASCAN(aCampos, {|z|z[1]=="COD"+STR(nOcor,1)}) IF nCrr > 0 ; aCampos[nCrr,2] := "15" ; ENDIF nTxt := ASCAN(aCampos, {|z|z[1]=="CORR0"+STR(nOcor,1)}) IF nTxt > 0 ; aCampos[nTxt,2] := cOutr ; ENDIF ENDIF ENDIF SysRefresh() Send2Word( aCampos, "cc-e", ALLTRIM(NFE_INFO->CCHAVE)+"-CCe_"+ALLTRIM(STR(_nRec))+".doc" ) RETURN NIL // Geração de modelos pelo word function Send2Word(aCampos, cDocName, cNewName, _Prview) local x, oWord, cTempDoc,; cModelo := CurDrive()+":\"+CurDir()+"\modelos\"+cDocName+".doc" //importante colocar a letra do drive senão dá erro IF ! FILE(cModelo) MsgAlert("O documento modelo não foi encontrado:"+CRLF+CRLF+cModelo, "Aviso") RETURN NIL ENDIF DEFAULT cNewName := cDocName, _Prview := .T. cAguarde := "Gerando o documento. Aguarde..." DEFINE DIALOG oEspere FROM 0, 0 TO 4, 20 TITLE "Um momento..." oEspere:lHelpIcon := .f. @05,05 SAY oAguarde PROMPT cAguarde SIZE 80, 10 PIXEL OF oEspere UPDATE ACTIVATE DIALOG oEspere CENTER NOWAIT cTempDoc := strtran(cModelo, "\modelos\", "\") IF ! EMPTY(cNewName) ; cTempDoc := CurDrive()+":\"+CurDir()+"\tempdir\"+cNewName ; ENDIF if file(cTempDoc) ferase(cTempDoc) SysRefresh() endif oWord := TWord():New() // inicia o objeto OLE Word if oWord:IsVisible() oWord:Hide() endif oWord:OpenDoc( cModelo ) // abre o documento modelo for x=1 to len( aCampos ) if valtype(aCampos[x,2]) != "A" oWord:Replace( '['+aCampos[x,1]+']' , aCampos[x,2] ) else nLen := LEN('['+aCampos[x,1]+']') nEnd := oWord:Replace( '['+aCampos[x,1]+']' , " " ) oWord:AddTables(aCampos[x,2], nEnd-nLen ) endif next //oWord:preview() // visualiza o documento no preview do Word //oWord:Visualizar() // visualiza o documento //oWord:PrintDoc(.t.) // imprime o documento sem apresentar na tela oWord:Save(cTempDoc) oWord:end() SysRefresh() IF _Prview if file(cTempDoc) WHILE .T. nOpc := ALERT("Escolha uma opção",{"Visualizar","Enviar p/ E-mail","Retornar"},"Escolha uma opção") IF nOpc == 1 WAITRUN( GetEnv( "ComSpec" )+" /C START WINWORD "+cTempDoc, 0) LOOP ELSEIF nOpc == 2 _Subj := "Arquivo anexo" _Msge := "Prezado(s) Senhor(es),"+CRLF+CRLF+; "Anexo a este e-mail voce esta recebendo o arquivo "+cFileName(cTempDoc)+"."+CRLF+CRLF+; "Para maiores esclarecimentos, favor nos catactar."+CRLF+CRLF+ALLTRIM(mEmp) MailMain(SPACE(60), _Subj, _Msge, cTempDoc) LOOP ENDIF EXIT END endif ENDIF oEspere:End() return nil
  2. Olá, Alessandro (aferra) e Luiz Fernando (EMPRESOFT) Obrigado pela ajuda fornecida. Problema resolvido. function Etq3colFr3() local oFrPrn, nTipo := 1 nTipo := Alert("Escolha uma opção",{"Imprimir","Editar"}, "Escolha uma opção") IF nTipo < 1 ; RETURN NIL ; ENDIF oFrPrn := frReportManager():new() oFrPrn:SetIcon(1) // Icone da janela do FRH oFrPrn:SetTitle( 'Etiquetas' ) // Titulo da janela do FRH oFrPrn:LoadLangRes( 'brazil.xml') // Arquivo de idioma oFrPrn:SetWorkArea( 'FR3TMPLB' , select('FR3TMPLB') ) oFrPrn:LoadFromFile('.\modelos\fr3\Etq3col89x25.fr3') // para leitura direta de arquivo FR3 oFrPrn:PreviewOptions:SetAllowEdit( .f. ) // inibe o botao de edicao do relatorio pelo usuario if nTipo == 1 oFrPrn:ShowReport() // aqui para gerar o preview do relatorio else oFrPrn:DesignReport() // aqui para "desenhar" o relatorio endif oFrPrn:ClearDataSets() oFrPrn:DestroyFR() return nil
  3. Obrigado. Ainda preciso: (1) Adquirir o FastReport; (2) Aprender a usá-lo com FWH 12.06. Podem cobrar pela aula. Quem se prontifica? Aguardo.
  4. Olá, Aferra. O link está quebrado. Favor verificar. Obrigado.
  5. Olá, amigos. Estou precisando aprender fazer relatórios, principalmente etiquetas, no fastreport. Alguém se prontifica a me ajudar? Preciso: • Adquirir o fastreport; • Aprender a usá-lo; • Fazer etiquetas para Zebra e Argox. Desde já agradeço.
  6. Ou tente assim: USE CONTROLE ALIAS CTR EXCLUSIVE NEW VIA "DBFCDX" BEGIN TRANSACTION CTR->(dbAppend()) // Se está salvando um novo registro, não notei esta instrução básica REPLACE CTR->COMP WITH "TESTE NA BASE DE DADOS SQL" END TRANSACTION CLOSE ALL Alguns detalhes sobre seu código acima: // Comentando seu código USE CONTROLE ALIAS CTR EXCLUSIVE NEW VIA "DBFCDX" dbSelectArea("CTR") // Desnecessário. Você acabou de abrir a tabela, portanto, ela já é a tabela selecionada atualmente. CTR->(DBGOTOP()) // Desnecessário. Poderia ser um DBAPPEND() REPLACE CTR->COMP WITH "TESTE NO ARQUIVO DBF" // Se não houve DBAPPEND não vai salvar nada, a menos que em sua tabela ja tenha um ou mais registros, o que vai acontecer conforme o Alberto - SP falou acima. CLOSE CTR // Fechou a tabela BEGIN TRANSACTION // Aqui você está iniciando uma TRANSACTION sendo que a tabela está fechada. Incorreto. USE CONTROLE ALIAS CTR NEW VIA "MYSQL" // Aqui você abre a tabela após o BEGIN TRANSACTION. Tem que ser o contrário. Primeiro abra a tabela. DBRLOCK() // Poderia ser um DBAPPEND, a menos que deseje alterar os dados da tabela em vez de inserir um novo registro. REPLACE CTR->COMP WITH "TESTE NA BASE DE DADOS SQL" END TRANSACTION CLOSE ALL
  7. O código do link acima não exemplifica a manipulação de dados (inclusão, alteração, exclusão, impressão). Mas já estou desenvolvendo conforme os exemplos que vêm no pacote. Noto que nossos colegas parecem não estar usando SQLRDD. De qualquer forma, muito obrigado pelas respostas.
  8. Ainda estou aguardando um PRG de exemplo. Do Jackson ou de qualquer outro membro. Agradeço desde já.
  9. Obrigado pela resposta, Jackson. Na verdade eu já tenho um pequeno programa que usa SQLRDD para conexão a Firebird ou MySQL. O que eu preciso é apenas comparar meu modo de programa com a dos colegas e, se necessário, copiar algumas idéias. Se possível, me manda um prg para eu estudar aqui. Grato.
  10. Olá, amigos. Alguém pode disponibilizar um exemplo de um cadastro qualquer (clientes, fornecedores, itens, etc.), em SQLRDD, que contenha: inclusão, alteração, exclusão, consulta e relatório? É só para estudo e tirar algumas idéias. Grato. Ariston Santos.
  11. Pelo que noto você está usando a rotina de impressão padrão do Fivewin. Se a impressora está compartilhada na rede e instalada em todos os computadores, basta defini-la como padrão que vai normalmente. Caso queira enviar direto para a impressora sem ter que defini-la como padrão, use a cláusula TO "NomeDaImpressora", assim: PRINT oPrn TO "DATAMAX M-CLASS MARQ" NAME "Impresión en Vertical.." preview
  12. Tião, aproveitei parte do teu código para corrigir o problema e deu certo. Muito obrigado a todos.
  13. Quando funcionava corretamente, eu chamava a função assim: local cBPort := ALLTRIM(GetPvProfString( "BALANCA", "PortaCOM", "COM1", ".\SISCOM.INI")) local cBVelo := VAL(GetPvProfString( "BALANCA", "Valocida", "4800", ".\SISCOM.INI")) local cBData := VAL(GetPvProfString( "BALANCA", "DataBits", "8", ".\SISCOM.INI")) local cBPari := LEFT(GetPvProfString( "BALANCA", "Paridade", "None", ".\SISCOM.INI"),1) local cBStop := VAL(GetPvProfString( "BALANCA", "StopBits", "1", ".\SISCOM.INI")) nHandle := Init_Port(cBPort,cBVelo,cBData,cBPari,cBStop,1024) Agora, se fazendo assim, dá esse erro: "abnormal program termination", e fecha o programa. Vasculhando, descobri que se eu mudar o valor de cBPari para 0 e cBStop para 1, não dá erro, mas também não lê nada. Alguém mais arrisca um palpite?
  14. Tião, obrigado. É esta mesmo que uso. Inclusive foi você que me meu ala na última vez que recorri ao forum. Interessante é que compila sem nenhum erro, mas não lê o peso nem da balança (COM1, via cabo) nem dos simuladores (COM4, via com0com). Antes lia perfeitamente. Sua função para ler peso aínda é a mesma? E você usa o xHarbour 1.2.1 ?
  15. Oi, amigos. Alguém tem um função de captura de peso, compilada com xHarbour 1.2.1, que seja 100% funcional? O problema é que a que a minha, usando a hbcomm.lib, parou de funcionar. Não lê a balança, não retorna o peso. Inclusive notei que houve mudança nela, pois a funcão Init_Port(), qua antes retornava nHandle, agora retorna .T. ou .F.. Agradeço.
  16. A PRIX III faz isso (http://www.toledobrasil.com.br/balanca/automacao-comercial/prix3) Uso esta função que você pode adaptar ao seu sistema: FUNCTION LerPesoBalanca(oDlVenda, nBPeso, nBalTry, oTimer) // Testado com PRIX-III Light local cBPort := ALLTRIM(GetPvProfString( "BALANCA", "PortaCOM", "COM1", ".\SISCOM.INI")) local cBVelo := VAL(GetPvProfString( "BALANCA", "Valocida", "4800", ".\SISCOM.INI")) local cBData := VAL(GetPvProfString( "BALANCA", "DataBits", "8", ".\SISCOM.INI")) local cBPari := LEFT(GetPvProfString( "BALANCA", "Paridade", "None", ".\SISCOM.INI"),1) local cBStop := VAL(GetPvProfString( "BALANCA", "StopBits", "1", ".\SISCOM.INI")) DEFAULT nBalTry := 0 IF oTimer != NIL ; oTimer:Deactivate() ; ENDIF oDlVenda:Update() nHandle := Init_Port(cBPort,cBVelo,cBData,cBPari,cBStop,14) If nHandle <= 0 MsgStop("Erro ao abrir a porta: " + cBPort + CRLF+"Verifique se a mesma não está sendo usada por outro programa.", "Alerta!") IF oTimer != NIL ; oTimer:Activate() ; ENDIF xQtd := 1 nBPeso := xQtd oDlVenda:Update() Return xQtd Endif OutBufClr(nHandle) // Limpa o Buffer de Saida OutChr(nHandle,CHR(5)) SysWait(0.3) Bytes := InbufSize(nHandle) cDados := Space(20) Buffer := InChr( nHandle, Bytes, @cDados) //LER BUFFER DE ENTRADA DA BALANCA UnInt_Port(nHandle) xQtd := (val(substr(cDados,2,5))/1000) IF xQtd <= 0 xQtd := 0 nBalTry ++ ENDIF IF xQtd = 0 IF nBalTry > 2 nBalTry := 0 xQtd := 1.000 MsgGet("Não leu a balança. Digite o peso","Não leu a balança. Digite o peso:",@xQtd) ENDIF ENDIF nBPeso := xQtd oDlVenda:Update() IF oTimer != NIL ; oTimer:Activate() ; ENDIF RETURN( xQtd )
  17. Amigo, tem como mandar uma cópia do teu preview com miniaturas para meu e-mail? ariston.ap@hotmail.com Grato.
  18. Amigo, Desculpa a falta de conhecimento, mas qual é o objetivo prático desta configuração? Seria para o casa de logar como convidado e, em determinado momento, não poder executar alguma ação por não ser administrador? Em caso positivo, dê um exemplo de bloqueio que seria feito? Motivo da pargunta: Já ocorreu de eu não conseguir registrar o programa usando a função que crie para isso porque o Windows simplesmente não permite gravar a informação via programa. Seria este um dos casos?
  19. O interesse é grande. Vejo aqui um motivo para Linhares voltar a dar atenção ao FiveDroid. Eu mosmo vou adquirir asism que estiver 100% funcional.
  20. Também estou interessado: ariston.ap@hotmail.com
  21. Isso muito me interessa também. É possível fazer a declaração da(s) função(ões) contida(s) naa DLLs. Pelo que notei, são duas DLLs: BarcodeImaging.dll e BarcodeScanner.dll. Aparentemente, a primeira é para escanear a partir de uma imagem e a segunda a partir de um scanner. O problema é saber o nome e os parâmetros de cada função. Procurei no google mas não encontrei nada relacionado. Se alguém descobrir, favor compartilhar.
  22. Perfeito. Funcionou. Era exatamente isso que eu queria. ISSO É QUE FORUM!! Obrigado a todos.
  23. Vem da tabela ITENS_DB, campo CODIGO. Antes de fazer o update, eu pego os itens cadastrados na tabela online em um vetor (via SELECT). Atualizo o estoque no vetor com base no DBF local, e quero dar um UPDATE na tabela online de todos os itens do vetor. Vou testar isso. Se funcionar, aviso. O Kleyber afima asima que apenas trocando o INSERT por UPDATE dá sim. De qualquer forma, já estou usando BEGIN e END TRANSCTION - SR_BeginTransaction() e SR_CommitTransaction(). Realmente fica bem mais rápido, mas ainda poderia melhorar. Obrigado a todos.
×
×
  • Create New...