Jump to content
Fivewin Brasil

Ariston Santos

Membros
  • Posts

    500
  • Joined

  • Last visited

  • Days Won

    11

Everything posted by Ariston Santos

  1. A função abaixo, que não me lembro de quam consegui, coleta a data e hora da internet (de São Paulo). Você pode usar para comparar com a data de seu micro Function HrDtInternet() Local oHttp, ; cResp1 := "", ; cResp := "", ; cHora := "", ; cData := "" local _oTmr // O timer inpedirá o SISCOM de parar de responder DEFINE TIMER _oTmr ; INTERVAL 1000 ; ACTION SysRefresh() ACTIVATE TIMER _oTmr IF !IsInternet() _oTmr:End() Return( {DtoC(Date()), Time()} ) ENDIF Try oHttp := CreateObject("winhttp.winhttprequest.5.1") oHttp:Open("GET","http://www.horacerta.com.br/index.php?city=sao_paulo",.f.) oHttp:Send() cResp1 := oHttp:ResponseText() Catch _oTmr:End() Return( {DtoC(Date()), Time()} ) End Try *<input name="mostrador" type="text" size="25" value="19/09/2011 - 01:02:00 PM" /> cResp := SubStr( cResp1 , At( '<input name="mostrador"', cResp1 ) ) cResp := Substr( cResp , 1, At( '/>', cResp )-2 ) cDados := SubStr( cResp , At( 'value="', cResp )+7 ) cData := SubStr( cDados, 1, 10) cHora := SubStr( cDados, 14 ) If "PM" $ cHora cHora := Str(Val(SubStr(cHora,1,2))+12,2)+SubStr(cHora,3,7) End _oTmr:End() * MsgInfo("Data: "+cData+CRLF+"Hora: "+cHora,"Na internet") Return( {cData, cHora} )
  2. Obrigado por ter compartilhado. Já peguei. Por isso, estou pedindo um exemplo de prgs que envie os dados para o fr3. De antemão, obrigado a quem puder compartilhar.
  3. Alguém tem e pode disponibilizar um exemplo de impressão do XML usando o FR3 disponibilizado para download acima? Pode ser do XML ou do conteúdo da NFC-e em array. Fico grato.
  4. Salva primeiro em vetor. Depois da ASORT no vetor. Em seguida, envia para o Excel. Ou, Indexa seu DBF na ordem desejada. Envia para o Excel classificado pela ordem do índice. -> dbsetorder(nOrd) Um exemplo usando vetor classificado com ASORT() *--------( Relatório de Positivação dos clientes )-----------------------------* FUNCTION RelPositiv() LOCAL lGoOn := .F., lSoPos := .T., lSoNeg := .F., lTodos := .F., lOrdNo:=.T.,lOrdVr:=.F.,lOrdId:=.F. PUBLIC nClie := SPACE(8) ,; cClie := SPACE(50),; nVddr := SPACE(3) ,; cVddr := SPACE(50),; cCliTp:="" d_Fim := CTOD("01/"+STRZERO(MONTH(DATE()),2)+"/"+STRZERO(YEAR(DATE()),4))-1 // Final do mês passado d_Ini := CTOD("01/"+STRZERO(MONTH(d_Fim-90),2)+"/"+STRZERO(YEAR(d_Fim-90),4)) // Início de três mêses atrás DEFINE FONT oDlTtf NAME "Verdana" SIZE 0, -12 DEFINE DIALOG oDPstv FROM 0,0 TO 20, 45 TITLE "Critérios para o relatório" oDPstv:SetFont(oDlTtf) @03, 05 SAY oSay1 PROMPT "Cliente" OF oDPstv SIZE 25, 10 PIXEL @14, 05 GET oNcli VAR nClie PICTURE "99999999" OF oDPstv SIZE 25, 12 PIXEL WHEN ! lTodos UPDATE VALID CliPesqCli(@nClie, @cClie, oDPstv) @13, 32 GET oCcli VAR cClie OF oDPstv SIZE 140, 12 PIXEL WHEN ! lTodos UPDATE MEMO READONLY @28,05 SAY "Tipo" SIZE 50,10 PIXEL OF oDPstv @38,05 COMBOBOX oCbx VAR cCliTp ITEMS {"ESPECIAL","DE VAREJO","DE ATACADO"," "} ; SIZE 170,40 OF oDPstv ; PIXEL @52, 05 SAY oSay2 PROMPT "Vendedor" OF oDPstv SIZE 40, 10 PIXEL @62, 05 GET oNvdd VAR nVddr PICTURE "999" OF oDPstv SIZE 25, 12 PIXEL UPDATE VALID PesqVdr(@nVddr, @cVddr, oDPstv, .F.) @62, 32 GET oCvdd VAR cVddr OF oDPstv SIZE 140, 12 PIXEL UPDATE MEMO READONLY @80, 05 SAY oSay3 PROMPT "Período:" OF oDPstv SIZE 30, 08 PIXEL @78, 37 GET oDat1 VAR d_Ini OF oDPstv SIZE 45, 12 PIXEL @78, 92 GET oDat2 VAR d_Fim OF oDPstv SIZE 45, 12 PIXEL @94, 05 SAY oSay1 PROMPT "Mostrar" OF oDPstv SIZE 25, 10 PIXEL @92, 32 CHECKBOX lSoPos PROMPT "Só Atendidos" SIZE 50,10 PIXEL OF oDPstv UPDATE ON CHANGE EVAL({||(lSoPos:=.T.,lSoNeg:=.F.,lTodos:=.F.,oDPstv:Update()),.T.}) @92, 84 CHECKBOX lSoNeg PROMPT "Não atendidos" SIZE 60,10 PIXEL OF oDPstv UPDATE ON CHANGE EVAL({||(lSoPos:=.F.,lSoNeg:=.T.,lTodos:=.F.,oDPstv:Update()),.T.}) @92,146 CHECKBOX lTodos PROMPT "Todos" SIZE 30,10 PIXEL OF oDPstv UPDATE ON CHANGE EVAL({||(lSoPos:=.F.,lSoNeg:=.F.,lTodos:=.T.,oDPstv:Update()),.T.}) @106, 05 SAY oSay1 PROMPT "Classif." OF oDPstv SIZE 25, 10 PIXEL @104, 32 CHECKBOX lOrdNo PROMPT "Por nome" SIZE 50,10 PIXEL OF oDPstv UPDATE ON CHANGE EVAL({||(lOrdNo:=.T.,lOrdVr:=.F.,lOrdId:=.F.,oDPstv:Update()),.T.}) @104, 84 CHECKBOX lOrdVr PROMPT "Maior valor" SIZE 60,10 PIXEL OF oDPstv UPDATE ON CHANGE EVAL({||(lOrdNo:=.F.,lOrdVr:=.T.,lOrdId:=.F.,oDPstv:Update()),.T.}) @104,146 CHECKBOX lOrdId PROMPT "Código" SIZE 30,10 PIXEL OF oDPstv UPDATE ON CHANGE EVAL({||(lOrdNo:=.F.,lOrdVr:=.F.,lOrdId:=.T.,oDPstv:Update()),.T.}) @130, 35 SBUTTON oS01 PROMPT "Prosseguir" OF oDPstv FILENAME ".\bitmaps\printer.bmp" ACTION (lGoOn := .t., oDPstv:End()) PIXEL SIZE 50, 14 COLORS CLR_BLACK,{nBtClr,CLR_WHITE,3} NOBORDER XP @130, 90 SBUTTON oS02 PROMPT "Cancelar" OF oDPstv FILENAME ".\bitmaps\stop.bmp" ACTION (lGoOn := .f., oDPstv:End()) PIXEL SIZE 50, 14 COLORS CLR_BLACK,{nBtClr,CLR_WHITE,3} NOBORDER XP ACTIVATE DIALOG oDPstv CENTERED ON INIT xFocus(oNcli) oDlTtf:End() IF ! lGoOn ; RETURN NIL ; ENDIF // Definir os meses abrangidos aMeses := {} aTotls := {{},{},{}} FOR nDt := d_Ini TO d_Fim cMano := RIGHT(DTOC(nDt),7) IF ASCAN(aMeses, cMano) == 0 AADD(aMeses, cMano) AADD(aTotls[1], 0) AADD(aTotls[2], 0) AADD(aTotls[3], 0) ENDIF NEXT nTtMes := LEN(aMeses) // Quantidade de meses // Pegar logo todos os clientes SELECT 6 CLIENTE->(DBCLEARFIL(NIL)) CLIENTE->(DBSETORDER(1)) CLIENTE->(DBGOTOP()) aRelInf := {} WHILE ! CLIENTE->(EOF()) IF ! EMPTY(cCliTp) IF ALLTRIM(CLIENTE->TIPOCLI) != cCliTp CLIENTE->(DBSKIP()) LOOP ENDIF ENDIF AADD(aRelInf, {.T.,; // Selecionado CLIENTE->CODCLI,; // Cód. Cliente CLIENTE->NOME}) // Nome Cliente CLIENTE->(DBSKIP()) END IF LEN(aRelInf) = 0 SysRefresh() MsgAlert("Sem clientes que se ajustem aos critérios informados","Aviso") RETURN NIL ENDIF // Criar um array com os meses abrangidos aListFor := {} // Vetor para informações FOR nLin := 1 TO LEN(aRelInf) // Incluir logo todos os clientes nForn := aRelInf[nLin,2] cForn := aRelInf[nLin,3] DECLARE aThisFor[nLin][nTtMes+1] // Quantidade de mêses + total AFILL(aThisFor[nLin], 0) // Iniciar zerado AADD(aThisFor[nLin],nForn) // Acrescentar coluna para codigo do fornecedor AADD(aThisFor[nLin],cForn) // Acrescentar coluna para nome do fornecedor AADD(aListFor, aThisFor[nLin]) NEXT // Pegar as vendas do período cFltr := "" IF VAL(nClie) > 0 cFltr += "VENDAS->ITEM01 = VAL(nClie)" ELSE cFltr += "VENDAS->ITEM01 > VAL('0')" ENDIF IF VAL(nVddr) > 0 IF ! EMPTY(cFltr) ; cFltr += " .AND. " ; ENDIF cFltr += "VENDAS->ITEM36 = VAL(nVddr)" ENDIF // ImpressÆo das vendas cTmpName := "" nFile := 1 WHILE .T. cTmpName := cPasta+"\VNDTMP"+STRZERO(nFile,2)+".CDX" FERASE(cTmpName) if ! file(cTmpName) EXIT endif nFile ++ END cTmpName := "VNDTMP"+STRZERO(nFile,2) SET SOFTSEEK ON SELECT 2 VENDAS->(DBSETORDER(3)) VENDAS->(DBSEEK(d_Ini, .T.)) INDEX ON VENDAS->ITEM48 TAG VNDTMP01 TO &(cTmpName) WHILE( VENDAS->ITEM48 >= d_Ini .AND. VENDAS->ITEM48 <= d_Fim) ordListClear() OrdListAdd(cTmpName, "VNDTMP01") SET SOFTSEEK OFF WHILE ! VENDAS->(EOF()) IF ! EMPTY(cFltr) IF ! &(cFltr) VENDAS->(DBSKIP()) LOOP ENDIF ENDIF c_Codig := VENDAS->ITEM01 d_Movim := VENDAS->ITEM48 n_Valor := VndTotal(1) TRY nSkn := ASCAN(aListFor, {|nCol|nCol[nTtMes+2]==c_Codig}) IF nSkn > 0 nCol := ASCAN(aMeses, RIGHT(DTOC(d_Movim),7)) aListFor[nSkn,nCol] += n_Valor ENDIF CATCH END TRY VENDAS->(DBSKIP()) END // Reabrir vendas para corrigir os índices SELECT 2 CLOSE VENDAS SysWait(0.2) SELECT 2 USE VENDAS SHARED ordListClear() OrdListAdd("VENDAS", "VENDCODI", "VENDCLIE", "VENDDATA", "VENDNCNT", "VENDPLAC", "VENDNCLI", "VENDNCCF") // Totalizar para poder classificar por maior valor FOR nRc := 1 TO LEN(aListFor) nTtl := 0 FOR nMe := 1 TO LEN(aMeses) nTtl += aListFor[nRc,nMe] NEXT aListFor[nRc,LEN(aMeses)+1] := nTtl NEXT // Classificar conforme critérios IF lOrdNo ; ASORT(aListFor,,,{|A,B| A[LEN(aMeses)+3] < B[LEN(aMeses)+3]}); ENDIF IF lOrdVr ; ASORT(aListFor,,,{|A,B| A[LEN(aMeses)+1] > B[LEN(aMeses)+1]}); ENDIF IF lOrdId ; ASORT(aListFor,,,{|A,B| A[LEN(aMeses)+2] < B[LEN(aMeses)+2]}); ENDIF // Exportar para excel nFile := 1 WHILE .T. cXlsFile := CurDrive()+":\"+CurDir()+"\tempdir\positv_cli_"+STRZERO(nFile,4)+".xls" if ! file(cXlsFile) EXIT endif nFile ++ END nFtit := XLSFont("Verdana", 11, .t., .f., .f.) nFinf := XLSFont("Arial Narrow", 12, .f., .f., .f.) nFtot := XLSFont("Verdana", 11, .t., .t., .f.) nForm := XLSFormat( '0.00' ) XLS oXLS FILE &(cXlsFile) AUTOEXEC OF oMainWnd nLin := 1 XLS COL 1 WIDTH 12 OF oXLS // Código do fornecedor XLS COL 2 WIDTH 35 OF oXLS // Nome do fornecedor FOR nFo := 1 TO LEN(aMeses) XLS COL nFo+2 WIDTH 12 OF oXLS // Meses NEXT XLS COL LEN(aMeses)+3 WIDTH 15 OF oXLS // Total @nLin, 1 XLS SAY "CÓDIGO" OF oXLS ALIGNAMENT ALING_LEFT BORDER FONT nFtit @nLin, 2 XLS SAY "CLIENTE" OF oXLS ALIGNAMENT ALING_LEFT BORDER FONT nFtit FOR nFo := 1 TO LEN(aMeses) @nLin, nFo+2 XLS SAY aMeses[nFo] OF oXLS ALIGNAMENT ALING_RIGHT BORDER FONT nFtit NEXT @nLin, LEN(aMeses)+3 XLS SAY "TOTAL" OF oXLS ALIGNAMENT ALING_RIGHT BORDER FONT nFtit FOR nRc := 1 TO LEN(aListFor) nTtl := aListFor[nRc,LEN(aMeses)+1] IF ! lTodos // Não incluir todos IF nTtl > 0 .AND. lSoPos == .F.; LOOP ; ENDIF // Só atendidos IF nTtl = 0 .AND. lSoNeg == .F.; LOOP ; ENDIF // Só não atendidos ENDIF nLin ++ @nLin, 1 XLS SAY STRZERO(aListFor[nRc,LEN(aMeses)+2],8) OF oXLS ALIGNAMENT ALING_LEFT BORDER FONT nFinf @nLin, 2 XLS SAY ALLTRIM(aListFor[nRc,LEN(aMeses)+3]) OF oXLS ALIGNAMENT ALING_LEFT BORDER FONT nFinf FOR nMe := 1 TO LEN(aMeses) @nLin, nMe+2 XLS SAY aListFor[nRc,nMe] OF oXLS ALIGNAMENT ALING_RIGHT FORMAT nForm BORDER FONT nFinf aTotls[1,nMe] += aListFor[nRc,nMe] aTotls[2,nMe] += IIF(aListFor[nRc,nMe] > 0, 1, 0) aTotls[3,nMe] += IIF(aListFor[nRc,nMe] = 0, 1, 0) NEXT @nLin, LEN(aMeses)+3 XLS SAY nTtl OF oXLS ALIGNAMENT ALING_RIGHT FORMAT nForm BORDER FONT nFinf NEXT nLin ++ @nLin, 1 XLS SAY " " OF oXLS ALIGNAMENT ALING_LEFT SHADED BORDER FONT nFtot @nLin, 2 XLS SAY "TOTAIS" OF oXLS ALIGNAMENT ALING_LEFT SHADED BORDER FONT nFtot FOR nMe := 1 TO LEN(aMeses) @nLin, nMe+2 XLS SAY "= = = = =" OF oXLS ALIGNAMENT ALING_RIGHT SHADED BORDER FONT nFtot NEXT @nLin, LEN(aMeses)+3 XLS SAY "= = = = =" OF oXLS ALIGNAMENT ALING_RIGHT SHADED BORDER FONT nFtot nTtl := 0 nLin ++ @nLin, 1 XLS SAY " " OF oXLS ALIGNAMENT ALING_LEFT BORDER FONT nFtot @nLin, 2 XLS SAY "EM VALOR:" OF oXLS ALIGNAMENT ALING_RIGHT BORDER FONT nFtot FOR nMe := 1 TO LEN(aTotls[1]) @nLin, nMe+2 XLS SAY aTotls[1][nMe] OF oXLS ALIGNAMENT ALING_RIGHT FORMAT nForm BORDER FONT nFtot nTtl += aTotls[1][nMe] NEXT @nLin, LEN(aTotls[1])+3 XLS SAY nTtl OF oXLS ALIGNAMENT ALING_RIGHT FORMAT nForm BORDER FONT nFtot nTtl := 0 nLin ++ @nLin, 1 XLS SAY " " OF oXLS ALIGNAMENT ALING_LEFT BORDER FONT nFtot @nLin, 2 XLS SAY "ATENDIDOS:" OF oXLS ALIGNAMENT ALING_RIGHT BORDER FONT nFtot FOR nMe := 1 TO LEN(aTotls[2]) @nLin, nMe+2 XLS SAY aTotls[2][nMe] OF oXLS ALIGNAMENT ALING_RIGHT FORMAT nForm BORDER FONT nFtot nTtl += aTotls[2][nMe] NEXT @nLin, LEN(aTotls[2])+3 XLS SAY "Méd: "+ALLTRIM(STR(nTtl/len(aMeses))) OF oXLS ALIGNAMENT ALING_RIGHT FORMAT nForm BORDER FONT nFtot nTtl := 0 nLin ++ @nLin, 1 XLS SAY " " OF oXLS ALIGNAMENT ALING_LEFT BORDER FONT nFtot @nLin, 2 XLS SAY "NÃO ATENDIDOS:" OF oXLS ALIGNAMENT ALING_RIGHT BORDER FONT nFtot FOR nMe := 1 TO LEN(aTotls[3]) @nLin, nMe+2 XLS SAY aTotls[3][nMe] OF oXLS ALIGNAMENT ALING_RIGHT FORMAT nForm BORDER FONT nFtot nTtl += aTotls[3][nMe] NEXT @nLin, LEN(aTotls[3])+3 XLS SAY "Méd: "+ALLTRIM(STR(nTtl/len(aMeses))) OF oXLS ALIGNAMENT ALING_RIGHT FORMAT nForm BORDER FONT nFtot ENDXLS oXLS RELEASE nClie, cClie, nVddr, cVddr, cCliTp SELECT 0 RETURN NIL
  5. Desculpem pela demora na resposta. Usei o exemplo postado acima pelo Jmsilva Apenas substitui os endereços pelos que preciso e acrescentei mais.
  6. Márcio Eduardo, só para não deixar sem resposta: Ainda não tenho matéria suficiente, nem telas, para postar. Prometo que, assim que tiver concluído o projeto SISCOMDroid, vou elaborar uma apostila em português, passo-a-passo, do Basic4Android, para desenvolvimento de uma aplicação completa, com acesso a SQLLite (local) e MySQL (remotamente). Claro que vai ter custo, mas falamos disso depois.
  7. Já consegui desenvolver um programinha para meu controle interno (contratos/mensalidades), salvando clientes e pagamentos em SLQLite. Muito rápido. Agora estou iniciando o desenvolvimento de um controle de pedidos para integrar com o SISCOM. Ainda não tenho material em português para compartilhar. A melhor apostila que encontrei está em inglês. Assim que eu tiver alguma coisa em português, compartilho. Se quiserem a apostila em inglês, peçam por email (ariston.ap@hotmail.com)
  8. Acho que quando o FiveTouch chegar meu SISCOMDroid já vai estar rodando a pleno vapor. Já aprendi a desenvolver para Android com basic4droid. Muito fácil. Aprendi antes de terminar o período de avaliação. Já comprei a versão full. Desenvolvimento a 1000 por hora. O futuro é agora. A quem interessar: www.basic4brasil.com.br / www.basic4ppc.com
  9. Olá. Pretendo criar uma função na qual eu passe um array com vários endereços e seja aberta uma página do google maps indicando a rota e um pontinho em cada endereço. Já tenho uma que mostra a rota para dois endereços (origem e destino) mas não serve para vários endereços. Alguém já fez algo parecido que possa compartilhar aqui? Desde já, agradeço.
  10. Funções para emissão de comandos para o ACBrNFeMonitor via txt ou socket (TCP/IP) ///////////////////////////////////////////////////////////////////////////// // // ACBR - Funcoes Compativeis com Monitor ACBr NFe // // Autor: Jose Carlos da Rocha // Data: 24/03/2009 // Email: irochinha@itelefonica.com.br // MSN: fivolution@hotmail.com // Linguagem: xBase // Prefixo: ACBR_NFE_ // Plataformas: DOS, Windows // Requerimentos: Harbour/xHarbour( Para uso com Clipper eliminar Prefixo ) // ///////////////////////////////////////////////////////////////////////////// #include "fivewin.ch" #include "fileio.ch" #include "commands.ch" #define ETX chr(3) #define CR chr(13) #define LF chr(10) Static sENDER := '' ,; SEM_ERRO := .F. ,; RET_IMP := '' Static sSOCKET *------------------------------------------------------------------------------* function ACBR_NFE_StatusServico() cCmd := "" ACBR_NFE_Comando( "NFE.StatusServico", ["]+cCmd+["] ) retorno := ACBR_NFE_Retorno(30) return retorno function ACBR_NFE_CriarNFeSefaz( cTxtNFe ) cCmd := iif(cTxtNFe=nil,"",cTxtNFe) ACBR_NFE_Comando( "NFE.CriarNFeSefaz", ["]+cCmd+["] ) retorno := ACBR_NFE_Retorno(45) return retorno function ACBR_NFE_ValidarNFe( cXML ) cCmd := iif(cXML=nil,"",cXML) ACBR_NFE_Comando( "NFE.ValidarNFe", ["]+cCmd+["] ) retorno := ACBR_NFE_Retorno(30) return retorno function ACBR_NFE_AssinarNFe( cXML ) cCmd := iif(cXML=nil,"",cXML) ACBR_NFE_Comando( "NFE.AssinarNFe", ["]+cCmd+["] ) retorno := ACBR_NFE_Retorno(30) return retorno function ACBR_NFE_EnviarNFe( cArquivo, nLote, nAssina, nImprime ) nLote := str( nLote ) nAssina := str( nAssina ) nImprime := str( nImprime ) cCmd := ["]+cArquivo+[",]+nLote+[,]+nAssina+[,]+nImprime ACBR_NFE_Comando( "NFE.EnviarNFe", cCmd ) retorno := ACBR_NFE_Retorno() return retorno function ACBR_NFE_ConsultarNFe( cNFe ) cCmd := iif(cNFe=nil,"",cNFe) ACBR_NFE_Comando( "NFE.ConsultarNFe", ["]+cCmd+["] ) retorno := ACBR_NFE_Retorno(60) return retorno function ACBR_NFE_CancelarNFe( cNFe, xMotivo ) cCmd := ["]+cNFe+[","]+xMotivo+["] ACBR_NFE_Comando( "NFE.CancelarNFe", cCmd ) retorno := ACBR_NFE_Retorno(60) return retorno function ACBR_NFE_ImprimirDANFe( cXML ) cCmd := iif(cXML=nil,"",cXML) ACBR_NFE_Comando( "NFE.ImprimirDANFe", ["]+cCmd+["] ) retorno := ACBR_NFE_Retorno(15) return retorno function ACBR_NFE_GerarPDF( cXML ) cCmd := iif(cXML=nil,"",cXML) ACBR_NFE_Comando( "NFE.ImprimirDanfePDF", ["]+cCmd+["] ) retorno := ACBR_NFE_Retorno(15) return retorno function ACBR_NFE_CCe( cIni ) cCmd := iif(cIni=nil,"",cIni) ACBR_NFE_Comando( "NFE.CARTADECORRECAO", ["]+cCmd+["] ) retorno := ACBR_NFE_Retorno(60) return retorno function ACBR_NFE_InutilizarNFe( cCNPJ, cJustificativa, nAno, nModelo, nSerie, nNumInicial, nNumFinal ) cCNPJ := iif(cCNPJ=nil,"XXXXXXXXXXXXXX",cCNPJ) cJustificativa := iif(cJustificativa=nil,"TESTE NFE",cJustificativa) nAno := str( nAno ) nModelo := str( nModelo ) nSerie := str( nSerie ) nNumInicial := str( nNumInicial ) nNumFinal := str( nNumfinal ) cCmd := ["]+cCNPJ+[","]+cJustificativa+[",]+nAno+[,]+nModelo+[,]+nSerie+[,]+nNumInicial+[,]+nNumFinal ACBR_NFE_Comando( "NFE.InutilizarNFe", cCmd ) retorno := ACBR_NFE_Retorno(60) return retorno function ACBR_NFE_CertDtVenc() cCmd := "" ACBR_NFE_Comando( "NFE.CertificadoDataVencimento", ["]+cCmd+["] ) retorno := ACBR_NFE_Retorno(10) return retorno function ACBR_NFE_Comando( cIndice, cDados ) local ret_line := "chr(13)+chr(10)" // Checar se a impressora está instalada... cPath := "C:\ACBrNFeMonitor" IF ! lIsDir(cPath) MsgInfo("O ACBrNFeMonitor não está instalado", "Aviso") RETURN NIL ENDIF cTcpIp := GetPvProfString( "ACBrNFeMonitor", "Modo_TCP", " ", "C:\ACBrNFeMonitor\ACBrNFeMonitor.ini") cIsTxt := GetPvProfString( "ACBrNFeMonitor", "Modo_TXT", " ", "C:\ACBrNFeMonitor\ACBrNFeMonitor.ini") c_Gate := GetPvProfString( "ACBrNFeMonitor", "TCP_Porta", "3436", "C:\ACBrNFeMonitor\ACBrNFeMonitor.ini") c_Ende := "" IF cTcpIp = "1" ; c_Ende := "127.0.0.1:"+c_Gate ; ENDIF IF cIsTxt = "1" ; c_Ende := "C:\ACBrNFeMonitor" ; ENDIF IF EMPTY(c_Ende) ; MsgAlert("Detectado erro de configuração no ACBrNFeMonitor","Aviso"); RETURN .F. ; ENDIF cDirDoMonitor := cPath errfile := "ENTNFE.CMD" cDados := iif(ValType(cDados)#"C","",cDados) cBuffer := cIndice + iif( len( cDados )=0,"()","(" + cDados + ")") IF cIsTxt = "1" errhandle := FCREATE(errfile) FWRITE(errhandle,cBuffer+&ret_line.) FCLOSE(errhandle) FERASE( cDirDoMonitor+"\ENTNFE.TXT" ) FERASE( cDirDoMonitor+"\SAINFE.TXT" ) COPY FILE &(errfile) TO &(cDirDoMonitor+"\"+errfile) FRENAME( cDirDoMonitor+"\"+errfile, cDirDoMonitor+"\ENTNFE.TXT" ) ELSEIF cTcpIp = "1" IF ! NFE_INIT(c_Ende) ; MsgAlert("Erro ao tentar abrir a porta de comunicação!","Aviso!") ; RETURN .F. ; ENDIF SysRefresh() IF ! NFE_ABERTA() ; RETURN .F. ; ENDIF SysRefresh() NFE_COMANDO( cBuffer ) SysRefresh() NFE_END() ENDIF return .t. function ACBR_NFE_Retorno(_Wait_) LOCAL cIsTxt := GetPvProfString( "ACBrNFeMonitor", "Modo_TXT", " ", "C:\ACBrNFeMonitor\ACBrNFeMonitor.ini") LOCAL c_Bufr DEFAULT _Wait_ := 300 // 5 MINUTOS IF _Wait_ < 30 ; _Wait_ := 30 ; ENDIF cPath := "C:\ACBrNFeMonitor" IF ! lIsDir(cPath) MsgInfo("O ACBrNFeMonitor não está instalado", "Aviso") RETURN NIL ENDIF cDirDoMonitor := cPath cNFELOG := RET_IMP if cIsTxt = "1" SysRefresh() DEFINE DIALOG o_Hold FROM 0, 0 TO 4, 54 TITLE "Espere..." o_Hold:lHelpIcon := .f. @05,05 SAY oAguarde PROMPT "Aguardando a resposta. Espere um momento..." SIZE 120, 24 PIXEL OF o_Hold UPDATE ACTIVATE DIALOG o_Hold CENTER NOWAIT do while _Wait_ > 0 SysRefresh() if file( cDirDoMonitor+"\SAINFE.TXT" ) cNFELOG := memoread( cDirDoMonitor+"\SAINFE.TXT" ) EXIT endif INKEY(1) _Wait_ -- enddo IF EMPTY(cNFELOG) ; cNFELOG := "ERRO: Sem resposta do Monitor da NF-e" ; ENDIF o_Hold:End() ENDIF c_Bufr := cNFELOG c_Linh := MEMOLINE(c_Bufr, 25, 1) if "ERRO:" $ c_Linh IF "Forbidden (403)" $ c_Bufr c_Bufr := "ERRO: WebService Consulta Status serviço: Forbidden (403)"+CRLF+CRLF+; "Causas prováveis:"+CRLF+; "O certificado digital não se encontra no período de validade."+CRLF+; "O certificado digital do cliente não é confiável ou é inválido."+CRLF+; "O certificado digital se encontra revogado."+CRLF+; "O certificado digital não foi enviado para o servidor."+CRLF+; "Muitos usuários conectados (erro raro)." ENDIF IF "The operation timed out" $ c_Bufr c_Bufr := STRTRAN(c_Bufr,"The operation timed out", "O tempo para a operação esgotou (The operation timed out).") c_Bufr := ALLTRIM(c_Bufr)+CRLF+CRLF+; "Talvez a NF-e tenha sido autorizada mas não houve retorno da SEFAZ. Consulte a NF-e"+CRLF+; "para se certificar disso. Se não constar na base da SEFAZ repita a transmissão." ENDIF IF "ERRO: Rejeicao: Uma NF-e da faixa ja esta inutilizada na Base de dados da SEFAZ" $ c_Bufr c_Bufr := "ERRO: Rejeicao: Uma NF-e da faixa ja esta inutilizada na Base de dados da SEFAZ" ENDIF SysRefresh() MsgErro(c_Bufr, 'Mensagem de erro do ACBrMonitor') endif return cNFELOG function VerifyINI( _section_, _entry_, _var_, _inifile_, _grava_ ) oIni := TIni():New( _inifile_ ) if _grava_ = .t. oIni:Set( _section_, _entry_, _var_ ) endif return oIni:Get( _section_, _entry_, _var_, _var_ ) ************************************************************************ Function NFE_INIT(ENDERECO) // Abre a comunicação com o ACBrmonitor * ENDERECO -> Diretorio ( quando usando TXT) Ex: C:\ACBR\ ************************************************************************ Local P, RET := .T., TFIM, IP, PORTA, RESP if ! empty(sENDER) // J est aberto... return .t. endif SEM_ERRO := .F. sENDER := alltrim(ENDERECO) IP := '' PORTA := 0 P := at(':',sENDER) if P = 0 P := len(sENDER)+1 endif IP := substr(sENDER,1,P-1) if empty(IP) RET := .F. else PORTA := val(substr(sENDER,P+1)) if PORTA = 0 PORTA := 3434 endif inetinit() RET := .F. TFIM := Seconds() + 5 /// Tenta conectar durante 5 segundos /// do while Seconds() < TFIM .and. ! RET sSOCKET := inetconnect(IP,PORTA) RET := (ineterrorcode(sSOCKET) = 0) SysWait(0.2) enddo endif if RET InetSetTimeout( sSOCKET, 300 ) // Timeout de Recepção 3 seg // RESP := InetRecvEndBlock( sSOCKET, ETX ) RET := ('Conectado' $ RESP ) // Recebeu as boas vindas ? endif if ! RET sENDER := '' endif return RET ************************************************************************ Function NFE_COMANDO(CMD,VET_PARAM,ESPERA,TENTA) * Funcao de uso interno para enviar os comandos e * registrar os erros retornados. Exibe os erros se existirem ************************************************************************ Local REQ, RESP, TEMPOR, TINI, TFIM, BLOCO, BYTES, I, TIPO_PARAM if empty(sENDER) if ! SEM_ERRO MsgAlert('ACBrNFeMonitor n†o foi inicializado.',"Aviso") endif return '' endif DEFAULT VET_PARAM to {} ,; ESPERA to 300 ,; // 5 minutos TENTA to .t. RET_IMP := '' c_Cmmd := SUBSTR(CMD,1,AT("(",CMD)-1) SysRefresh() DEFINE DIALOG o_Hold FROM 0, 0 TO 4, 54 TITLE "Espere..." o_Hold:lHelpIcon := .f. @05,05 SAY oAguarde PROMPT 'Processando o comando: '+c_Cmmd+". Espere um momento..." SIZE 200, 24 PIXEL OF o_Hold UPDATE ACTIVATE DIALOG o_Hold CENTER NOWAIT //////// Transmitindo o comando ///////// CMD := ALLTRIM(CMD)+CRLF+"."+CRLF // Requisitos do ACBR InetSetTimeout( sSOCKET, 300 ) // Timeout de Envio 3 seg // if inetsendall( sSOCKET, CMD ) <= 0 RET_IMP := 'ERRO: Nao foi possivel transmitir dados para o ACBrMonitor|'+; '('+AllTrim(Str(InetErrorCode( sSOCKET )))+') '+; InetErrorDesc( sSOCKET ) + ETX endif TINI := Seconds() do while (right(RET_IMP,1) <> ETX) SysRefresh() BLOCO := space(64) //////// Lendo a resposta //////// InetSetTimeout( sSOCKET, 300 ) BYTES := inetrecv(sSOCKET, @BLOCO, 64) RET_IMP += left(BLOCO,BYTES) if Seconds() > (TINI + ESPERA) if ! TENTA RET_IMP := 'ERRO: Sem resposta do ACBrMonitor em '+alltrim(str(ESPERA))+; ' segundos (TimeOut)' + ETX else if ALERT('O ACBrMonitor n†o est respondendo. '+; 'Deseja tentar novamente ?',{'SIM','NAO'}) # 1 RET_IMP := 'ERRO: Sem resposta do ACBrMonitor em '+alltrim(str(ESPERA))+; ' segundos (TimeOut)' + ETX else TINI := Seconds() endif endif endif enddo do while right(RET_IMP,1) $ CR+LF+ETX // Remove sinalizadores do final RET_IMP := left(RET_IMP,len(RET_IMP)-1) enddo o_Hold:End() return RET_IMP ************************************************************************ Function NFE_END() // Fecha a porta da Impressora * Encerra a comunicacao com a impressora, nao precisa de parametros ************************************************************************ if ! empty(sENDER) inetsendall( sSocket, 'ACBR.bye' ) endif if sSOCKET <> NIL inetclose(sSOCKET) inetdestroy(sSOCKET) inetcleanup() SysWait(0.2) sSOCKET := NIL endif sENDER := '' return .t. ************************************************************************ Function NFE_ABERTA() // Retorna .t. se a COM ja est aberta ************************************************************************ return ! empty(sENDER)
  11. Como eu gero o TXT da NF-e para usar tanto Emissor Gratuito como no ACBrNFeMonitor. FUNCTION GeraTxtNFe(_NfeNr) LOCAl c_Txt, cNfeVer, l_ACBr, cQDesc, lQDesc, cCodRg, cComDes, cDesPr LOCAL nTarIR, nTarCS, nTaPIS, nTaCOF // Pegar base de cálculo do IR/CS/PIS/COFINS n_Area := SELECT() cQDesc := GetPvProfString( "CONFIGURACAO", "CfgDesconto", " ", ".\sisnfe.Ini") cComDes:= GetPvProfString( "CONFIGURACAO", "ComDesconto", "0", ".\sisnfe.Ini") c_Version := GetPvProfString( "CONFIGURACAO", "APPVERSION", "2.2.20", ".\sisnfe.Ini") l_ACBr := IIF(GetPvProfString( "VENDACFG", "NFeVia_ACBrNFe", "N", ".\siscom.ini")="S",.T.,.F.) cTpAmb := GetPvProfString( "CONFIGURACAO", "TIPAMBIENTE", " ", ".\sisnfe.Ini") // 1-Produção; 2-homologação c_Ambi := GetPvProfString("WebService", "Ambiente", "0", "C:\ACBrNFeMonitor\ACBrNFeMonitor.ini") IF c_Ambi = "0" ; cTpAmb := "1" ; ENDIF // 1-Produção IF c_Ambi = "1" ; cTpAmb := "2" ; ENDIF // 2-homologação // Deletar os TXTs gerados para agilizar a importação aFiles := DIRECTORY( CurDrive()+":\"+CurDir()+"\remessa\NFe-*.txt" ) FOR nX := 1 TO Len( aFiles ) IF aFiles[nX,3] < DATE() FERASE(CurDrive()+":\"+CurDir()+"\remessa\"+aFiles[ nX, 1 ]) ENDIF NEXT DEFINE DIALOG o_Wait FROM 0, 0 TO 4, 20 TITLE "Gerando TXT da NFe..." o_Wait:lHelpIcon := .f. @05,05 SAY oAguarde PROMPT "Gerando TXT. Aguarde..." SIZE 80, 10 PIXEL OF o_Wait UPDATE ACTIVATE DIALOG o_Wait CENTER NOWAIT c_Txt := "NOTA FISCAL|1|"+CRLF c_Txt += "A|2.00|NFe|"+CRLF c_Txt += "B|"+RetCodUFIBGE(NFE_INFO->NFE_UF)+; // Cód. da UF do emitente "| |"+ALLTRIM(NFE_INFO->NATOP)+; // Natureza da operação "|"+ALLTRIM(NFE_INFO->FORMPG)+; // 0=A vista; 1 = A Prazo; 2 = Outros "|55"+; // Modelo "|"+ALLTRIM(NFE_INFO->SERIE)+; // Série 0=única ; 900-SCAN "|"+STRZERO(NFE_INFO->NFENUM,9)+; // Número do documento fiscal "|"+STR(YEAR(NFE_INFO->NFEEMI),4)+"-"+STRZERO(MONTH(NFE_INFO->NFEEMI),2)+"-"+STRZERO(DAY(NFE_INFO->NFEEMI),2)+; // Emissão - AAAA-MM-DD "|"+STR(YEAR(NFE_INFO->DTSAID),4)+"-"+STRZERO(MONTH(NFE_INFO->DTSAID),2)+"-"+STRZERO(DAY(NFE_INFO->DTSAID),2)+; // Saída - AAAA-MM-DD "|"+IIF(SECS(NFE_INFO->NFHORA+":00") > 0, NFE_INFO->NFHORA+":00", "")+; // Hora da saída - Emissão "|"+NFE_INFO->NFETIP+; // Tipo: 0=Entrada; 1=Saída "|"+STRZERO(VAL(RetCodMunIBGE(NFE_INFO->MUNICI, NFE_INFO->NFE_UF, .F.)),7)+; // Código do município "|1"+; // Tipo de impressão: 1=Retrato; 2=Paisagem "|"+IIF(NFE_INFO->TPEMIS $ "1;2;3", NFE_INFO->TPEMIS, "1")+; // Tipo de emissão: 1=Nomral; 2=Contingencia; 3=SCAN "| "+; // Dígito verificador. Não informar para importação. "|"+cTpAmb+; // Tipo de ambiente: 1=Produção; 2=Homologação "|"+NFE_INFO->FINALI+; // Finalidade da NFe: 1=Nomral; 2=Complementar; 3=Ajuste "|3"+; // Processo de NFe: 3=Emissão pelo aplicativo do fisco "|"+c_Version // Versão do palicativo emissor gratuito IF VAL(ALLTRIM(NFE_INFO->SERIE)) >= 900 c_Txt += "|"+STR(YEAR(NFE_INFO->NFEEMI),4)+"-"+STRZERO(MONTH(NFE_INFO->NFEEMI),2)+"-"+STRZERO(DAY(NFE_INFO->NFEEMI),2)+" "+LEFT(NFE_INFO->NFHORA,5)+":00"+"|PROBLEMAS NOS SERVICOS DE NFe DA SEFAZ" ENDIF c_Txt += "|"+CRLF // Fim da TAG // Se for Devolução de Mercadorias, Substituição de NF cancelada, // Complementação de NF, etc., informar o campo B13 IF !EMPTY(NFE_INFO->REFNFE) c_Txt += "B13|"+NFE_INFO->REFNFE+"|"+CRLF // Chave de Acesso da NF-e referenciada ENDIF // Se for referenciar um NF normal, informar os registros do campo B14 IF !EMPTY(NFE_INFO->NF1NRO) c_Txt += "B14|"+RetCodUFIBGE(NFE_INFO->NF1_UF)+; // Código da UF do emitente - IBGE (NF normal) "|"+RIGHT(STR(YEAR(NFE_INFO->NFEEMI),4),2)+STRZERO(MONTH(NFE_INFO->NFEEMI),2)+; // Ano/Ano emissão da NF-e "|"+R_CnpjLienar(NFE_INFO->NF1CGC)+; // Cnpj do emitente da NF (NF normal) "|01"+; // Modelo do documento fiscal - 01 (NF normal) "|"+ALLTRIM(NFE_INFO->NF1SER)+; // Série do documento fiscal (NF normal) "|"+ALLTRIM(STR(VAL(NFE_INFO->NF1NRO)))+; // Número do documento fiscal (NF normal) "|"+CRLF // Fechamento da TAG ENDIF // Se for referenciar um Cupom Fiscal, informar os registros do campo B20j IF VAL(NFE_INFO->NROECF) > 0 .AND. VAL(NFE_INFO->NROCOO) > 0 c_Txt += "B20j|"+ALLTRIM(NFE_INFO->MODECF)+; // Modelo "|"+STRZERO(VAL(NFE_INFO->NROECF),3)+; // Número ECF "|"+STRZERO(VAL(NFE_INFO->NROCOO),6)+; // Número COO "|"+CRLF // Fechamento da TAG ENDIF // Emitente cCodRg := NFE_INFO->REGIME // 1=Simples Nacional; 2=Simples Excesso de sublimite; 3=Regime Normal IF EMPTY(cCodRg) cCodRg := "3" // Regime Normal IF l_Simp cCodRg := "1" // Simples Nacional IF l_SExc cCodRg := "2" // Simples Nacional - Excesso de sublimite ENDIF ENDIF ENDIF c_Txt += "C|"+TiraAcentos(ALLTRIM(NFE_INFO->E_NOME))+; // Razão social ou nome do emitente "|"+TiraAcentos(ALLTRIM(NFE_INFO->E_FANT))+; // Nome de fantasia "|"+ALLTRIM(ClearChar(NFE_INFO->E_IEST ,{".","-"}))+; // Inscrição Estadual "|"+; // ID do substituto tributário "|"+; // Inscrição Municipal "|"+; // CNAE FISCAL = Deve ser informado quando IM for informado "|"+cCodRg+"|"+CRLF // Código de Regime Tributário - CRT: 1 - Simples Nacional; 2 - Simples Nacional - excesso de sublimite de receita bruta; 3 - Regime Normal // Seleção entre CNPJ e CPF do emitente IF LEN(ALLTRIM(ClearChar(NFE_INFO->E_CNPJ, {".","-","/",","}))) < 14 c_Txt += "C02a|"+R_cpfLienar(NFE_INFO->E_CNPJ)+"|"+CRLF // CPF ELSE c_Txt += "C02|"+R_CnpjLienar(NFE_INFO->E_CNPJ)+"|"+CRLF // CNPJ ENDIF // Endereço do emitente c_Txt += "C05|"+TiraAcentos(ALLTRIM(NFE_INFO->E_LOGR))+; // Logradouro "|"+ALLTRIM(NFE_INFO->E_NUME)+; // Número "|"+TiraAcentos(ALLTRIM(NFE_INFO->E_CMPL))+; // Complemento "|"+TiraAcentos(ALLTRIM(NFE_INFO->E_BAIR))+; // Bairro "|"+STRZERO(VAL(RetCodMunIBGE(NFE_INFO->MUNICI, NFE_INFO->NFE_UF, .F.)),7)+; // Cód. município "|"+TiraAcentos(ALLTRIM(NFE_INFO->MUNICI))+; // Município "|"+ALLTRIM(NFE_INFO->NFE_UF)+; // Sigla UF "|"+LEFT(ClearChar(NFE_INFO->E_CEP,{".","-"}),8)+; // CEP "|"+RetCodPaisIBGE("BRASIL")+; // Código do País "|Brasil"+; // País "|"+RIGHT(ClearChar(ALLTRIM(NFE_INFO->E_FONE),{"(",")","-"," "}),10)+"|"+CRLF // Fone // Destinatário d_IE := "" if LEN(ALLTRIM(ClearChar(NFE_INFO->D_CNPJ,{".","-","/",","}))) = 14 if EMPTY(NFE_INFO->D_IEST) .or. AllTrim(NFE_INFO->D_IEST) = "ISENTO" d_IE := "ISENTO" else d_IE := ClearChar(NFE_INFO->D_IEST ,{".","-"}) endif else d_IE := "ISENTO" Endif c_xNome := "" IF cTpAmb = "2" // Se for homologação c_xNome := "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL" ELSE c_xNome := "("+ALLTRIM(STR(NFE_INFO->D_NCLI))+") "+TiraAcentos(ALLTRIM(NFE_INFO->D_NOME)) ENDIF IF UPPER(ALLTRIM(NFE_INFO->D_PAIS)) != "BRASIL" ; d_IE := "" ; ENDIF c_Txt += "E|"+LEFT(c_xNome, 60)+; // Nome do destinatário - 2 a 60 caracteres "|"+ALLTRIM(d_IE)+; // Inscrição estadual "|"+ALLTRIM(NFE_INFO->D_SUFR)+"|"+; // Inscrição na SUFRAMA "|"+ALLTRIM(NFE_INFO->D_MAIL)+"|"+CRLF // E-mail IF LEN(ALLTRIM(ClearChar(NFE_INFO->D_CNPJ, {".","-","/",","}))) < 14 c_Cnpj := R_cpfLienar(NFE_INFO->D_CNPJ) IF VAL(c_Cnpj) = 0 ; c_Cnpj := "" ; ENDIF c_Txt += "E03|"+c_Cnpj+"|"+CRLF // CPF ELSE c_Txt += "E02|"+R_CnpjLienar(NFE_INFO->D_CNPJ)+"|"+CRLF // CNPJ ENDIF // Endereço do destinatário c_Txt += "E05|"+TiraAcentos(ALLTRIM(NFE_INFO->D_LOGR))+; // Logradouro "|"+ALLTRIM(NFE_INFO->D_NUME)+; // Número "|"+TiraAcentos(ALLTRIM(NFE_INFO->D_CMPL))+; // Complemento "|"+TiraAcentos(ALLTRIM(NFE_INFO->D_BAIR))+; // Bairro "|"+STRZERO(VAL(RetCodMunIBGE(NFE_INFO->D_CIDA, NFE_INFO->D_UF, .F.)),7)+; // Cód. município "|"+TiraAcentos(ALLTRIM(NFE_INFO->D_CIDA))+; // Município "|"+ALLTRIM(NFE_INFO->D_UF)+; // Sigla UF "|"+LEFT(ALLTRIM(ClearChar(NFE_INFO->D_CEP,{".","-"})),8)+; // CEP "|"+RetCodPaisIBGE(NFE_INFO->D_PAIS)+; // Código do País "|"+ALLTRIM(NFE_INFO->D_PAIS)+; // País "|"+RIGHT(ClearChar(ALLTRIM(NFE_INFO->D_FONE),{"(",")","-", ""}),10)+"|"+CRLF // Fone // Incluir os itens na nfe SELECT(n_ItmArea) _nDes := 0 nItem := 0 nBCim := 0 nICMS := 0 nBCst := 0 nVRst := 0 c_Err := "" nTpro := 0 nImposto := 0 // De Olho no Imposto nBclIPPT := 0 // Base de calculo do imposto WHILE ! NFE_ITEM->(EOF()) // .T. _cField := "NFE_ITEM->NFENRO" IF &(_cField) = _NfeNr nItem ++ n_Vprod := (NFE_ITEM->QUANTI * NFE_ITEM->PRUNIT) nBcIcms := NFE_ITEM->BCICMS // (NFE_ITEM->QUANTI * NFE_ITEM->PRUNIT) n_Desc := 0 IF NFE_ITEM->PRUNIT < NFE_ITEM->PRSDES IF cComDes = "2" // Mostra o desconto só no item. Total já com desconto imbutido n_Desc := (NFE_ITEM->PRSDES-NFE_ITEM->PRUNIT) * NFE_ITEM->QUANTI n_Vprod := (NFE_ITEM->QUANTI * NFE_ITEM->PRUNIT) ELSEIF cComDes = "3" // Mostra o desconto no item e no cabeçalho. Total sem e com desconto n_Desc := (NFE_ITEM->PRSDES - NFE_ITEM->PRUNIT) * NFE_ITEM->QUANTI n_Vprod := (NFE_ITEM->QUANTI * NFE_ITEM->PRSDES) _nDes += n_Desc ELSE // Sem desconto n_Vprod := (NFE_ITEM->QUANTI * NFE_ITEM->PRUNIT) ENDIF ENDIF nTpro += n_Vprod cDesPr := TiraAcentos(ALLTRIM(STRTRAN(NFE_ITEM->DESCRI,"¥"," L:")))+; // Descrição do produto ou serviço IIF(!EMPTY(NFE_ITEM->DISCRIM), ";"+ALLTRIM(NFE_ITEM->DISCRIM), "") // Discriminação detalhada cStrDesc := "" IF n_Desc > 0 // Mostrar desconto IF cComDes = "2" // Só na descrição do itne cDesPr += ";Desc. R$ "+ALLTRIM(TRANS(n_Desc, "@E 999,999.99"))+" ("+ALLTRIM(TRANS(AR_ROUND((100/NFE_ITEM->PRSDES) * (NFE_ITEM->PRSDES-NFE_ITEM->PRUNIT)),"@E 999.99"))+"%)" ENDIF ENDIF c_NCM := +ALLTRIM(ClearChar(NFE_ITEM->CFISCA,{"."})) IF VAL(c_NCM) = 0 ; c_NCM := "99999900" ; ENDIF c_Txt += "H|"+ALLTRIM(STR(nItem))+"||"+CRLF // Número do item e informação adicional IF cComDes != "3" c_Txt += "I|"+STRZERO(VAL(NFE_ITEM->EAN_13),13)+; // Código do produto ou serviço "|"+; // Código Ean13 "|"+LEFT(cDesPr,120)+; // Descrição do produto "|"+c_NCM+; // Código NCM "|"+; // Código EX_IPI "|"+ALLTRIM(ClearChar(NFE_ITEM->CFOP, {"."} ))+; // CFOP "|"+ALLTRIM(NFE_ITEM->UNIDAD)+; // UND "|"+ALLTRIM(STR(NFE_ITEM->QUANTI,15,4))+; // Qtd "|"+ALLTRIM(STR(NFE_ITEM->PRUNIT,21,10))+; // Valor da Unidade Comercial* "|"+ALLTRIM(STR(NFE_ITEM->PRUNIT * NFE_ITEM->QUANTI,15,2))+; // Tot. bruto* "|"+; // Código Ean13 tributável "|"+ALLTRIM(NFE_ITEM->UNIDAD)+; // UND tributável "|"+ALLTRIM(STR(NFE_ITEM->QUANTI,15,4))+; // Qtd tributável "|"+ALLTRIM(STR(NFE_ITEM->PRUNIT,21,10))+; // PrUn UND tributável* "|"+IIF(NFE_ITEM->V_FRET > 0, ALLTRIM(STR(NFE_ITEM->V_FRET,15,2)), "")+; // Valor do frete "|"+IIF(NFE_ITEM->V_SEGU > 0, ALLTRIM(STR(NFE_ITEM->V_SEGU,15,2)), "")+; // Valor do seguro "|"+; // Desconto* "|"+IIF(NFE_ITEM->V_OUTR > 0, ALLTRIM(STR(NFE_ITEM->V_OUTR,15,2)), "")+; // Outras despesas "|1"+; // indTot - 0 – o valor do item (vProd) não compõe o valor total da NF-e (vProd) 1 – o valor do item (vProd) compõe o valor total da NF-e. "|"+IIF(cMovCd > 0,ALLTRIM(STR(cMovCd))," ")+; // xPed - Numero do pedido de compra de uso do emissor "||"+CRLF // informar o número do item do pedido de compra, o campo é de livre uso do emissor. ELSE c_Txt += "I|"+STRZERO(VAL(NFE_ITEM->EAN_13),13)+; // Código do produto ou serviço "|"+; // Código Ean13 "|"+LEFT(cDesPr,120)+; // Descrição do produto "|"+c_NCM+; // Código NCM "|"+; // EXTIPI "|"+ALLTRIM(ClearChar(NFE_ITEM->CFOP, {"."} ))+; // CFOP "|"+ALLTRIM(NFE_ITEM->UNIDAD)+; // UND "|"+ALLTRIM(STR(NFE_ITEM->QUANTI,15,4))+; // Qtd "|"+ALLTRIM(STR(NFE_ITEM->PRSDES,21,10))+; // Valor da Unidade Comercial* "|"+ALLTRIM(STR(NFE_ITEM->PRSDES * NFE_ITEM->QUANTI,15,2))+; // Tot. bruto* "|"+; // Código Ean13 Tributável "|"+ALLTRIM(NFE_ITEM->UNIDAD)+; // UND tributável "|"+ALLTRIM(STR(NFE_ITEM->QUANTI,15,4))+; // Qtd tributável "|"+ALLTRIM(STR(NFE_ITEM->PRSDES,21,10))+; // PrUn UND tributável* "|"+IIF(NFE_ITEM->V_FRET > 0, ALLTRIM(STR(NFE_ITEM->V_FRET,15,2)), "")+; // Valor do frete "|"+IIF(NFE_ITEM->V_SEGU > 0, ALLTRIM(STR(NFE_ITEM->V_SEGU,15,2)), "")+; // Valor do seguro "|"+IIF(n_Desc > 0, ALLTRIM(STR(n_Desc,15,2)), "")+; // Desconto* "|"+IIF(NFE_ITEM->V_OUTR > 0, ALLTRIM(STR(NFE_ITEM->V_OUTR,15,2)), "")+; // Outras despesas "|1"+; // indTot - 0 – o valor do item (vProd) não compõe o valor total da NF-e (vProd) 1 – o valor do item (vProd) compõe o valor total da NF-e. "|"+IIF(cMovCd > 0,ALLTRIM(STR(cMovCd))," ")+; // xPed - Numero do pedido de compra de uso do emissor "||"+CRLF // informar o número do item do pedido de compra, o campo é de livre uso do emissor. ENDIF // Dados de importação, se houver IF !EMPTY(NFE_ITEM->DINMRO) c_Txt += "I18|"+ALLTRIM(NFE_ITEM->DINMRO)+; // Número da DI "|"+STR(YEAR(NFE_ITEM->DIRGDT),4)+"-"+STRZERO(MONTH(NFE_ITEM->DIRGDT),2)+"-"+STRZERO(DAY(NFE_ITEM->DIRGDT),2)+; // /Data de registro - AAAA-MM-DD "|"+ALLTRIM(NFE_ITEM->DILOCA)+; // Local de desembaraço "|"+ALLTRIM(NFE_ITEM->DIUFDA)+; // Sigla da UF onde ocorreu o Desembaraço Aduaneiro "|"+STR(YEAR(NFE_ITEM->DIDADT),4)+"-"+STRZERO(MONTH(NFE_ITEM->DIDADT),2)+"-"+STRZERO(DAY(NFE_ITEM->DIDADT),2)+; // Data do Desembaraço Aduaneiro "|"+ALLTRIM(NFE_ITEM->DICODX)+; // Código do exportador "|"+CRLF // Gechamento da TAG IF ! EMPTY(NFE_ITEM->DIADN1) c_Txt += "I25|1"+; // Número da adição - 01 "|"+ALLTRIM(STR(VAL(NFE_ITEM->DIADN1)))+; // Número sequencial do item 1 "|"+ALLTRIM(NFE_ITEM->DIFAB1)+; // Cód. fabricante 1 "|"+; // Desconto 1 "|"+CRLF // Gechamento da TAG ENDIF IF ! EMPTY(NFE_ITEM->DIADN2) c_Txt += "I25|2"+; // Número da adição - 01 "|"+ALLTRIM(STR(VAL(NFE_ITEM->DIADN2)))+; // Número sequencial do item 1 "|"+ALLTRIM(NFE_ITEM->DIFAB2)+; // Cód. fabricante 1 "|"+; // Desconto 2 "|"+CRLF // Gechamento da TAG ENDIF IF ! EMPTY(NFE_ITEM->DIADN3) c_Txt += "I25|3"+; // Número da adição - 01 "|"+ALLTRIM(STR(VAL(NFE_ITEM->DIADN3)))+; // Número sequencial do item 1 "|"+ALLTRIM(NFE_ITEM->DIFAB3)+; // Cód. fabricante 1 "|"+; // Desconto 3 "|"+CRLF // Gechamento da TAG ENDIF IF ! EMPTY(NFE_ITEM->DIADN4) c_Txt += "I25|4"+; // Número da adição - 01 "|"+ALLTRIM(STR(VAL(NFE_ITEM->DIADN4)))+; // Número sequencial do item 1 "|"+ALLTRIM(NFE_ITEM->DIFAB4)+; // Cód. fabricante 1 "|"+; // Desconto 4 "|"+CRLF // Gechamento da TAG ENDIF IF ! EMPTY(NFE_ITEM->DIADN5) c_Txt += "I25|5"+; // Número da adição - 01 "|"+ALLTRIM(STR(VAL(NFE_ITEM->DIADN5)))+; // Número sequencial do item 1 "|"+ALLTRIM(NFE_ITEM->DIFAB5)+; // Cód. fabricante 1 "|"+; // Desconto 5 "|"+CRLF // Gechamento da TAG ENDIF ENDIF // LOTE DO ITEM IF (!EMPTY(NFE_ITEM->LOTENR)) .AND. ; (!EMPTY(DTOS(NFE_ITEM->FABRIC))) .AND. ; (!EMPTY(DTOS(NFE_ITEM->VALIDA))) nQtLote := INT(NFE_ITEM->QTLOTE) nVlrPmc := NFE_ITEM->VLRPMC IF nQtLote = 0 ; nQtLote := INT(NFE_ITEM->QUANTI) ; ENDIF IF nVlrPmc = 0 ; nVlrPmc := NFE_ITEM->PRUNIT ; ENDIF c_Txt += "K"+; // Medicamento "|"+ALLTRIM(NFE_ITEM->LOTENR)+; // Número do Lote do medicamento "|"+ALLTRIM(STR(nQtLote))+; // Quantidade de produto no Lote do medicamento "|"+STR(YEAR(NFE_ITEM->FABRIC),4)+"-"+STRZERO(MONTH(NFE_ITEM->FABRIC),2)+"-"+STRZERO(DAY(NFE_ITEM->FABRIC),2)+; // Data de fabricação - AAAA-MM-DD "|"+STR(YEAR(NFE_ITEM->VALIDA),4)+"-"+STRZERO(MONTH(NFE_ITEM->VALIDA),2)+"-"+STRZERO(DAY(NFE_ITEM->VALIDA),2)+; // Data de validade - AAAA-MM-DD "|"+ALLTRIM(STR(nVlrPmc,15,02))+; // Preço máximo consumidor "|"+CRLF // Fechamento da TAG ENDIF // LOTES DA NF-E AVULSA aItLts := GetNfeItmLotes(ALLTRIM(STR(NFE_ITEM->NFENRO)), NFE_ITEM->EAN_13) IF LEN(aItLts) > 0 FOR nLt := 1 TO LEN(aItLts) nQtLote := INT(aItLts[nLt,2]) nVlrPmc := aItLts[nLt,5] c_Txt += "K"+; // Medicamento "|"+ALLTRIM(aItLts[nLt,1])+; // Número do Lote do medicamento "|"+ALLTRIM(STR(nQtLote))+; // Quantidade de produto no Lote do medicamento "|"+STR(YEAR(aItLts[nLt,3]),4)+"-"+STRZERO(MONTH(aItLts[nLt,3]),2)+"-"+STRZERO(DAY(aItLts[nLt,3]),2)+; // Data de fabricação - AAAA-MM-DD "|"+STR(YEAR(aItLts[nLt,4]),4)+"-"+STRZERO(MONTH(aItLts[nLt,4]),2)+"-"+STRZERO(DAY(aItLts[nLt,4]),2)+; // Data de validade - AAAA-MM-DD "|"+ALLTRIM(STR(nVlrPmc,15,02))+; // Preço máximo consumidor "|"+CRLF // Fechamento da TAG NEXT ENDIF IF !EMPTY(NFE_ITEM->CODANP) c_Txt += "L01"+; // Combustíveis e lubrificantes "|"+ALLTRIM(NFE_ITEM->CODANP)+; // COD ANP "|"+; // CODIF "|"+; // QTemp "|"+cUFcon+; // UF de consumo "|"+CRLF // Fechamento da TAG ENDIF c_Txt += "M|"+CRLF // Grupo de tributos incidentes no produto ou serviço c_Txt += "N|"+CRLF // ICMS c_CST := alltrim(NFE_ITEM->S_TRIB) c_Orig := "0" IF VAL(cCodRg) == 1 // Simples nacional c_Orig := NFE_ITEM->ORIGIT // Origem da mercadoria: 0=Nacional; 1=Estrangeira importada; 2=Estrangeira adquirida no mercado interno IF EMPTY(c_Orig) ; c_Orig := "0"; ENDIF IF EMPTY(c_CST); c_CST := "102" ; ENDIF IF c_CST != "101" c_Txt += "N10d|"+c_Orig+"|"+c_CST+"|"+CRLF ELSE c_Txt += "N10c|"+c_Orig+"|"+c_CST+; "|"+ALLTRIM(STR(NFE_ITEM->B_ICMS,5,2))+; // Aliquota aplicável de calculo de crédito "|"+ALLTRIM(STR((nBcIcms / 100)*NFE_ITEM->B_ICMS,15,2))+; // Crédito do ICMS que pode ser aproveitado "|"+CRLF // Fechamento da TAG ENDIF ELSE // Normal ou excesso de sublimite (2 ou 3) c_Orig := LEFT(NFE_ITEM->S_TRIB,1) // Origem da mercadoria: 0=Nacional; 1=Estrangeira importada; 2=Estrangeira adquirida no mercado interno c_CST := RIGHT(alltrim(NFE_ITEM->S_TRIB),2) IF EMPTY(c_Orig) ; c_Orig := "0"; ENDIF DO CASE CASE (NFE_ITEM->RDICMS = 0 .AND. NFE_ITEM->B_ICMS > 0) .AND. ; // Tributada integralmente (NFE_ITEM->ST_MVA = 0 .AND. NFE_ITEM->B_ICST = 0) // Sem MVA c_Txt += "N02|"+c_Orig+; // Origem da mercadoria: 0=Nacional; 1=Estrangeira importada; 2=Estrangeira adquirida no mercado interno "|"+RIGHT(NFE_ITEM->S_TRIB,2)+; // Código da Situação Tributária "|0"+; // Modalidade de determinação da BC do ICMS ( 0 - Margem Valor Agregado 1-Pauta (Valor) 2 = Preço Tabelado Máx. (valor) 3 -Valor da Operação ) "|"+ALLTRIM(STR(nBcIcms,15,2))+; // Valor da BC do ICMS "|"+ALLTRIM(STR(NFE_ITEM->B_ICMS,5,2))+; // Aliquota do ICMS "|"+ALLTRIM(STR((nBcIcms / 100)*NFE_ITEM->B_ICMS,15,2))+; // Valor do ICMS "|"+CRLF // Fechamento da TAG nBCim += nBcIcms nICMS += (nBcIcms / 100) * NFE_ITEM->B_ICMS CASE (NFE_ITEM->RDICMS = 0 .AND. NFE_ITEM->B_ICMS > 0) .AND. ; // Tributada integralmente (NFE_ITEM->ST_MVA > 0 .AND. NFE_ITEM->B_ICST > 0) .AND. c_CST == "90" // Com MVA nIcmsMva := NFE_ITEM->BCICST nBCst += nIcmsMva nVRst += NFE_ITEM->V_ICST nBCim += (NFE_ITEM->QUANTI * NFE_ITEM->PRUNIT) nICMS += (nBcIcms / 100) * NFE_ITEM->B_ICMS c_Txt += "N10|"+c_Orig+; // 2-Origem da mercadoria: 0=Nacional; 1=Estrangeira importada; 2=Estrangeira adquirida no mercado interno "|"+c_CST+; // 3-Código da Situação Tributária "|"+NFE_ITEM->MBICMS+; // 4-Modalidade de determinação BC ICMS "|"+IIF(NFE_ITEM->RDICMS == 0,"",ALLTRIM(STR(NFE_ITEM->RDICMS,5,2)))+; // Percentual de redução da base de cálculo "|"+ALLTRIM(STR(nBcIcms - ((nBcIcms / 100) * NFE_ITEM->RDICMS),15,2))+; // Valor da BC do ICMS "|"+ALLTRIM(STR(NFE_ITEM->B_ICMS,5,2))+; // Aliquota do ICMS "|"+ALLTRIM(STR(((nBcIcms - ((nBcIcms / 100) * NFE_ITEM->RDICMS))/100)*NFE_ITEM->B_ICMS,15,2))+; // Valor do ICMS "|"+NFE_ITEM->MBISIT+; // 9-Modalidade de determinação BC ICMS ST "|"+IIF(NFE_ITEM->ST_MVA > 0, ALLTRIM(STR(NFE_ITEM->ST_MVA, 5,2)), "")+; // 10-Percentual do MVA ST "|"+; // 11-Percentual redução do MVA ST "|"+ALLTRIM(STR(nIcmsMva, 15, 2))+; // 12-Valor da BC do ICMS ST "|"+ALLTRIM(STR(NFE_ITEM->B_ICST,5,2))+; // 13-Percentual do ICMS ST "|"+ALLTRIM(STR(NFE_ITEM->V_ICST,15,2))+; // 14-Valor do ICMS "|"+CRLF // Fechamento da TAG CASE NFE_ITEM->RDICMS > 0 .AND. NFE_ITEM->B_ICMS > 0 // Com redução de base de cálculo IF NFE_ITEM->V_ICST == 0 // Sem ICMS ST c_Txt += "N04|"+c_Orig+; // Origem da mercadoria: 0=Nacional; 1=Estrangeira importada; 2=Estrangeira adquirida no mercado interno "|"+RIGHT(NFE_ITEM->S_TRIB,2)+; // Código da Situação Tributária "|0"+; // Modalidade de determinação da BC do ICMS ( 0 - Margem Valor Agregado 1-Pauta (Valor) 2 = Preço Tabelado Máx. (valor) 3 -Valor da Operação ) "|"+ALLTRIM(STR(NFE_ITEM->RDICMS,5,2))+; // Percentual de redução da base de cálculo "|"+ALLTRIM(STR(NFE_ITEM->V_PROD - ((NFE_ITEM->V_PROD / 100) * NFE_ITEM->RDICMS),15,2))+; // Valor da BC do ICMS "|"+ALLTRIM(STR(NFE_ITEM->B_ICMS,5,2))+; // Aliquota do ICMS "|"+ALLTRIM(STR(((NFE_ITEM->V_PROD - ((NFE_ITEM->V_PROD / 100) * NFE_ITEM->RDICMS))/100)*NFE_ITEM->B_ICMS,15,2))+; // Valor do ICMS "|"+CRLF // Fechamento da TAG nBCim += NFE_ITEM->V_PROD - ((NFE_ITEM->V_PROD / 100) * NFE_ITEM->RDICMS) nICMS += ((NFE_ITEM->V_PROD - ((NFE_ITEM->V_PROD / 100) * NFE_ITEM->RDICMS))/100) * NFE_ITEM->B_ICMS ELSE // Com ICMS ST - Outros IF EMPTY(c_CST) ; c_CST := "70" ; ENDIF nIcmsMva := NFE_ITEM->BCICST nBCst += NFE_ITEM->BCICST nVRst += NFE_ITEM->V_ICST nBCim += NFE_ITEM->BCICMS nICMS += NFE_ITEM->VRICMS c_Txt += "N09|"+c_Orig+; // Origem da mercadoria: 0=Nacional; 1=Estrangeira importada; 2=Estrangeira adquirida no mercado interno "|"+c_CST+; // Código da Situação Tributária "|"+NFE_ITEM->MBICMS+; // Modalidade de determinação da BC do ICMS "|"+ALLTRIM(STR(NFE_ITEM->RDICMS,5,2))+; // Percentual da redução "|"+ALLTRIM(STR(NFE_ITEM->BCICMS,15,2))+; // Valor da BC do ICMS "|"+ALLTRIM(STR(NFE_ITEM->B_ICMS,5,2))+; // Aliquota do ICMS "|"+ALLTRIM(STR(NFE_ITEM->VRICMS,15,2))+; // Valor do ICMS "|"+NFE_ITEM->MBISIT+; // Modalidade de determinação da BC do ICMS ST "|"+; // Percentual adicinado (Opcional) "|"+; // Percentual da redução "|"+ALLTRIM(STR(NFE_ITEM->BCICST,15,2))+; // Valor da BC do ICMS ST "|"+ALLTRIM(STR(NFE_ITEM->B_ICST,5,2))+; // Aliquota do ICMS ST "|"+ALLTRIM(STR(NFE_ITEM->V_ICST,15,2))+; // Valor do ICMS ST "|"+CRLF // Fechamento da TAG ENDIF CASE NFE_ITEM->RDICMS = 0 .AND. NFE_ITEM->B_ICMS = 0 // 40=Isenta, 41=Não tributada e 50=Suspensão; 30,60 = ST IF NFE_ITEM->V_ICST > 0 // CST – 90 - ICMS substituição tributária com ou sem MVA nBCst += NFE_ITEM->BCICST nVRst += NFE_ITEM->V_ICST IF EMPTY(c_CST) ; c_CST := "90" ; ENDIF c_Txt += "N10|"+c_Orig+; // 2-Origem da mercadoria: 0=Nacional; 1=Estrangeira importada; 2=Estrangeira adquirida no mercado interno "|"+c_CST+; // 3-Código da Situação Tributária "|"+; // 4-Modalidade de determinação BC ICMS "|"+; // 5-Valor da BC do ICMS "|"+; // 6-ercentual de redução da base de cálculo "|"+; // 7-Aliquota do ICMS "|"+; // 8-Valor do ICMS "|4"+; // 9-Modalidade de determinação BC ICMS ST "|"+IIF(NFE_ITEM->ST_MVA > 0, ALLTRIM(STR(NFE_ITEM->ST_MVA, 5,2)), "")+; // 10-Percentual do MVA ST "|"+; // 11-Percentual redução do MVA ST "|"+ALLTRIM(STR(NFE_ITEM->BCICST,15,2))+; // 12-Valor da BC do ICMS ST "|"+ALLTRIM(STR(NFE_ITEM->B_ICST, 5,2))+; // 13-Percentual do ICMS ST "|"+ALLTRIM(STR(NFE_ITEM->V_ICST,15,2))+; // 14-Valor do ICMS "|"+CRLF // Fechamento da TAG ELSEIF (NFE_ITEM->B_ICST > 0 .AND. NFE_ITEM->RDICST > 0) .OR. c_CST == "70" // ST C/Redução e Outros // CST - 70 - Com redução de base de cálculo e cobrança do ICMS por substituição tributária IF EMPTY(c_CST) ; c_CST := "70" ; ENDIF c_Txt += "N04|"+c_Orig+; // Origem da mercadoria: 0=Nacional; 1=Estrangeira importada; 2=Estrangeira adquirida no mercado interno "|"+c_CST+; // Código da Situação Tributária "|0"+; // Modalidade de determinação da BC do ICMS ( 0 - Margem Valor Agregado 1-Pauta (Valor) 2 = Preço Tabelado Máx. (valor) 3 -Valor da Operação ) "|"+ALLTRIM(STR(NFE_ITEM->RDICST,5,2))+; // Percentual de redução da base de cálculo "|"+ALLTRIM(STR(nBcIcms - ((nBcIcms / 100) * NFE_ITEM->RDICST),15,2))+; // Valor da BC do ICMS "|"+ALLTRIM(STR(NFE_ITEM->B_ICST,5,2))+; // Aliquota do ICMS "|"+ALLTRIM(STR(((nBcIcms - ((nBcIcms / 100) * NFE_ITEM->RDICST))/100)*NFE_ITEM->B_ICST,15,2))+; // Valor do ICMS "|"+CRLF // Fechamento da TAG nBCim += NFE_ITEM->BCICMS // nBcIcms - ((nBcIcms / 100) * NFE_ITEM->RDICST) nICMS += ((nBcIcms - ((nBcIcms / 100) * NFE_ITEM->RDICST))/100) * NFE_ITEM->B_ICST c_Txt += "N09|"+c_Orig+; // Origem da mercadoria: 0=Nacional; 1=Estrangeira importada; 2=Estrangeira adquirida no mercado interno "|"+c_CST+; // Código da Situação Tributária "|"+NFE_ITEM->MBICMS+; // Modalidade de determinação da BC do ICMS "|"+ALLTRIM(STR(NFE_ITEM->RDICST,5,2))+; // Percentual da redução "|"+ALLTRIM(STR(NFE_ITEM->BCICMS,15,2))+; // Valor da BC do ICMS "|"+ALLTRIM(STR(NFE_ITEM->B_ICMS,5,2))+; // Aliquota do ICMS "|"+ALLTRIM(STR(NFE_ITEM->VRICMS,15,2))+; // Valor do ICMS "|"+NFE_ITEM->MBISIT+; // Modalidade de determinação da BC do ICMS ST "|0"+; // Percentual adicinado (Opcional) "|"+ALLTRIM(STR(NFE_ITEM->RDICST,5,2))+; // Percentual da redução "|"+ALLTRIM(STR(NFE_ITEM->BCICST,15,2))+; // Valor da BC do ICMS ST "|"+ALLTRIM(STR(NFE_ITEM->B_ICST,5,2))+; // Aliquota do ICMS ST "|"+ALLTRIM(STR(NFE_ITEM->V_ICST,15,2))+; // Valor do ICMS ST "|"+CRLF // Fechamento da TAG nBCst += nBcIcms - ((nBcIcms / 100) * NFE_ITEM->RDICST) nVRst += ((nBcIcms - ((nBcIcms / 100) * NFE_ITEM->RDICST))/100) * NFE_ITEM->B_ICST ELSE // Isento ou não tributado IF EMPTY(c_CST) ; c_CST := "41" ; ENDIF c_Txt += "N06|"+c_Orig+; // Origem da mercadoria: 0=Nacional; 1=Estrangeira importada; 2=Estrangeira adquirida no mercado interno "|"+c_CST+; // Código da Situação Tributária "|"+CRLF // Fechamento da TAG ENDIF ENDCASE ENDIF // IPI IF ! EMPTY(NFE_ITEM->DINMRO) // Se for importação não calcular - Isento c_Txt += "O"+; "|"+; // Classe de enquadramento (cigarros/bebidas) "|"+; // CNPJ do produtor (quando diferente do emitente) "|"+; // Cód. Selo controle do IPI "|"+CRLF // Quantidade de selos c_Txt += "O08|02|"+CRLF // Veja tabela ELSE IF ! EMPTY(NFE_ITEM->CST_IPI) // IPI normal c_Txt += "O"+; "|"+; // Classe de enquadramento (cigarros/bebidas) "|"+; // CNPJ do produtor (quando diferente do emitente) "|"+; // Cód. Selo controle do IPI "|"+CRLF // Quantidade de selos IF NFE_ITEM->B_IPI > 0 // Tributado pelo IPI c_Txt += "O07|"+ALLTRIM(NFE_ITEM->CST_IPI)+"|"+ALLTRIM(STR(NFE_ITEM->VR_IPI,15,2))+CRLF c_Txt += "O10|"+ALLTRIM(STR(nBcIcms,15,2))+"|"+ALLTRIM(STR(NFE_ITEM->B_IPI,5,2))+CRLF ELSE // Não tributado ou isado de IPI c_Txt += "O08|"+ALLTRIM(NFE_ITEM->CST_IPI)+CRLF ENDIF ENDIF ENDIF // Imposto de importação: P|VBC|VDespAdu|VII|VIOF| IF ! EMPTY(NFE_ITEM->DINMRO) c_Txt += "P"+; "|"+ALLTRIM(STR(NFE_ITEM->IIVRBC,15,2))+; // BC II "|"+ALLTRIM(STR(NFE_ITEM->IIDESP,15,2))+; // Desp. Aduaneiras "|"+ALLTRIM(STR(NFE_ITEM->IIVLOR,15,2))+; // Valor II "|"+ALLTRIM(STR(NFE_ITEM->IIVIOF,15,2))+; // Valor IOF "|"+CRLF // Fechamento da TAG ENDIF c_Txt += "Q|"+CRLF // PIS IF NFE_ITEM->B_PIS > 0 c_Txt += "Q02|01"+; // Operação Tributável (base de cálculo = valor da operação alíquota normal (cumulativo/não cumulativo)) "|"+ALLTRIM(STR(NFE_ITEM->B_PIS,15,2))+; // BC PIS "|"+ALLTRIM(STR(NFE_ITEM->A_PIS, 5,2))+; // Aliquota PIS "|"+ALLTRIM(STR(NFE_ITEM->V_PIS,15,2))+; // Valor PIS "|"+CRLF // Fechamento da TAG ELSE c_Txt += "Q04|07|"+CRLF // 07=Isento de contriubuição ENDIF c_Txt += "S|"+CRLF // COFINS IF NFE_ITEM->B_COFI > 0 c_Txt += "S02|01"+; // Operação Tributável (base de cálculo = valor da operação alíquota normal (cumulativo/não cumulativo)) "|"+ALLTRIM(STR(NFE_ITEM->B_COFI,15,2))+; // BC COFINS "|"+ALLTRIM(STR(NFE_ITEM->A_COFI, 5,2))+; // Aliquota COFINS "|"+ALLTRIM(STR(NFE_ITEM->V_COFI,15,2))+; // Valor COFINS "|"+CRLF // Fechamento da TAG ELSE c_Txt += "S04|07|"+CRLF // 07=Isento de contriubuição ENDIF // Cálculo no valor do imposto com base na tabela do IPPT (Lei De Olho no Imposto) // Para os CFOPs de venda ao consumidor IF ALLTRIM(ClearChar(NFE_ITEM->CFOP, {"."} )) $ "5101|5102|5103|5104|5105|5403|5405|6101|6102|6103|6104|6105|6403|6405|" nImposto += CalcIPPT(c_NCM, c_Orig, n_Vprod) nBclIPPT += n_Vprod ENDIF ELSE EXIT ENDIF NFE_ITEM->(DBSKIP(1)) END SELECT(n_InfArea) // Totais cVfret := IIF(NFE_INFO->T_FRET > 0, ALLTRIM(STR(NFE_INFO->T_FRET,15,2)), "0") cVsegu := IIF(NFE_INFO->T_SEGU > 0, ALLTRIM(STR(NFE_INFO->T_SEGU,15,2)), "0") cVoutr := IIF(NFE_INFO->T_DESP > 0, ALLTRIM(STR(NFE_INFO->T_DESP,15,2)), "0") c_Txt += "W|"+CRLF // Grupo de Totais c_Txt += "W02"+; // Grupo de valores totais referentes ao ICMS "|"+ALLTRIM(STR(nBCim,15,2))+; // Base de cálculo do ICMS "|"+ALLTRIM(STR(nICMS,15,2))+; // Valor do ICMS "|"+ALLTRIM(STR(NFE_INFO->T_BSUB,15,2))+; // Base de cálculo do ICMS ST "|"+ALLTRIM(STR(NFE_INFO->T_ISUB,15,2))+; // Valor do ICMS ST "|"+ALLTRIM(STR(nTpro,15,2))+; // Valor total dos produtos "|"+cVfret+; // Valor do frete "|"+cVsegu+; // Valor do seguro "|"+ALLTRIM(STR(_nDes,15,2))+; // Valor do desconto "|"+ALLTRIM(STR(NFE_INFO->T_VRII,15,2))+; // Valor II "|"+ALLTRIM(STR(NFE_INFO->T_IPI,15,2))+; // Valor do IPI "|"+ALLTRIM(STR(NFE_INFO->T_PIS,15,2))+; // Valor do PIS "|"+ALLTRIM(STR(NFE_INFO->T_COFI,15,2))+; // Valor do COFINS "|"+cVoutr+; // Outras despesas "|"+ALLTRIM(STR(NFE_INFO->T_TOTA,15,2))+; // Total da nfe "|"+CRLF // Fechamento da TAG nTtlNfe := NFE_INFO->T_TOTA // Transporte c_Txt += "X|"+STR(NFE_INFO->T_MFRT,1)+"|"+CRLF // 0=Por conta do emitente; 1=Por conta do destinatário c_Txt += "X03"+; // Transportador "|"+TiraAcentos(ALLTRIM(NFE_INFO->T_RAZA))+; // Nome ou Razão Social "|"+ALLTRIM(clearChar(NFE_INFO->T_IEST,{".","-"}))+; // IE "|"+TiraAcentos(ALLTRIM(NFE_INFO->T_ENDE))+; // Endereço "|"+TiraAcentos(ALLTRIM(NFE_INFO->T_ESTA))+; // UF "|"+TiraAcentos(ALLTRIM(NFE_INFO->T_CIDA))+; // Cidade "|"+CRLF // Fechamento da TAG IF ! EMPTY(NFE_INFO->T_CNPJ) IF LEN(ALLTRIM(ClearChar(NFE_INFO->T_CNPJ, {".","-","/",","}))) < 14 c_Txt += "X05|"+R_cpfLienar(NFE_INFO->T_CNPJ)+"|"+CRLF // CPF do transpotador ELSE c_Txt += "X04|"+R_CnpjLienar(NFE_INFO->T_CNPJ)+"|"+CRLF // CNPJ da Transportadora ENDIF ELSE c_Txt += "X04| |"+CRLF // CNPJ da Transportadora ENDIF c_Txt += "X26"+; // Volumes "|"+ALLTRIM(STR(IIF(NFE_INFO->T_VOLS > 0, NFE_INFO->T_VOLS, nItem)))+; // Quantidade - 15 caracteres "|"+ALLTRIM(IIF(!EMPTY(NFE_INFO->T_ESPE),NFE_INFO->T_ESPE, "ITENS"))+; // Espécie "|"+ALLTRIM(NFE_INFO->T_MARC)+; // Marca "|"+ALLTRIM(STR(NFE_INFO->T_NVOL))+; // Volume "|"+ALLTRIM(STR(NFE_INFO->T_PESL,15,3))+; // Peso bruto "|"+ALLTRIM(STR(NFE_INFO->T_PESB,15,3))+; // Peso liquido "|"+CRLF // Fechamento da TAG nTtlPar := 0 SELECT(n_DupArea) NFE_DUPL->( dbGotop() ) NFE_DUPL->(DBSETORDER(2)) _cField := "NFE_DUPL->NFENRO" IF NFE_DUPL->(DBSEEK(_NfeNr)) c_Txt += "Y|"+CRLF // Cobrança n_Par := 1 WHILE ! NFE_DUPL->( EOF() ) IF &(_cField) = _NfeNr nTtlPar += NFE_DUPL->NVALOR c_Txt += "Y07"+; // Duplicata "|"+ALLTRIM(STR(n_Par))+; // Numero da Duplicata "|"+STR(YEAR(NFE_DUPL->DVENCI),4)+"-"+STRZERO(MONTH(NFE_DUPL->DVENCI),2)+"-"+STRZERO(DAY(NFE_DUPL->DVENCI),2)+; // Vencimento - AAAA-MM-DD "|"+ALLTRIM(STR(NFE_DUPL->NVALOR,15,2))+; // Valor da Duplicata "|"+CRLF // Fechamento da TAG ELSE EXIT ENDIF n_Par ++ NFE_DUPL->( dbSkip() ) END ENDIF // Informações adicionais cVlrImp := "" IF nImposto > 0 nImpAlq := ((100/nBclIPPT)*nImposto) cVlrImp := "VALOR APROXIMADO DOS TRIBUTOS: "+ALLTRIM(TRANS(nImposto, "@E 999,999.99"))+" ("+ALLTRIM(TRANS(nImpAlq,"@E9999.99"))+"%) Fonte: IBPT. " ELSE cVlrImp := "(SEM DADO SUFICIENTE PARA CÁLCULO DO VALOR APROXIMADO DOS TRIBUTOS.) " ENDIF c_Txt += "Z||"+cVlrImp+ALLTRIM(NFE_INFO->T_INFO)+"|" cPathTxt := CurDrive()+":\"+CurDir()+"\remessa" cFile := cPathTxt+"\NFe-"+alltrim(str(_NfeNr))+".txt" IF ! FileWrite(cFile, c_Txt) o_Wait:End() RETURN NIL ENDIF o_Wait:End() IF ! l_ACBr IF MsgYesNo("Arquivo TXT criado com sucesso:"+CRLF+CRLF+; cFile+CRLF+; "NF-e número: "+ALLTRIM(STR(NFE_INFO->NFENUM))+CRLF+CRLF+; "Para transmitir, utilize o programa fornecido pelo Fisco.","TXT Criado") ENDIF ELSE MsgEnviar(cPathTxt+"\NFe-"+alltrim(str(_NfeNr))+".txt") ENDIF RETURN NIL
  12. Eu uso. Pretendo mudar para a classe do Gilmer assim que ele se libertar da FlexDocs. Enquanto isso, uso ACBrNFeMonitor e Emissor gratuito. Gero o TXT conforme o layout do emissor gratuito, que também é lido pelo ACBrNFeMonitor. Não gero arquivo .ini do ACBr porque preferi fazer apenas uma rotina que servisse para os dois. Caso queira algumas dicas, entre em contato pelo ariston.ap@hotmail.com
  13. Tem sim. Salve-o em um campo MEMO: XmlFile := C:\16...-nfe.xml // Local onde vc grava o XML REPLACE NFEXML->TXTXML WITH MEMOREAD(XmlFile) // Salvar em banco de dados, campo tipo MEMO
  14. Oi, Gilmer. Podes postar as declarações da DLL ? Ou um exemplo de uso ? Grato.
  15. // Testing how to scroll a dialog with its contents // with support for different DPIs thanks to Ramesh Babu ! #include "FiveWin.ch" *#define d_width 4 *#define d_height 18 #define LOGPIXELSX 88 STATIC d_width := 4, d_height := 13 FUNCTION Main() LOCAL oDlg, oScrDlg local hDC := GetDC( 0 ) DEFINE DIALOG oDlg RESOURCE "dlgComScroll" ; TITLE "Scroll dialog" ; STYLE nOR( WS_VSCROLL, WS_HSCROLL ) oDlg:bMouseWheel = { | nKey, nDelta, nXPos, nYPos | MouseWheel( nKey, nDelta, nXPos, nYPos, oScrDlg ) } ACTIVATE DIALOG oDlg ; ON INIT ( Set_D_Height(), oScrDlg := TScrDlg():New( oDlg, 1, 65, 1, 70), oDlg:SetSize( 560, 550 ), oDlg:Center() ) RETURN( NIL ) function MouseWheel( nKey, nDelta, nXPos, nYPos, oScrDlg ) local oVScroll := oScrDlg:oDlg:oVScroll if nDelta < 0 oVScroll:GoDown() else oVScroll:GoUp() endif oScrDlg:VScroll() return nil //============================================================================ // FUNCTION : Set_D_Height() // Purpose : To Set new d_height for the Scroll bar //============================================================================ PROCEDURE Set_D_Height() LOCAL nDpi := GetCurrentDpi() d_height := (nDpi * 13 / 96) RETURN //============================================================================ // FUNCTION : GetCurrentDpi() // Purpose : To Get the Windows Current DPI Setting //============================================================================ FUNCTION GetCurrentDpi() local hDc := GetDc(0) local nDpi := GetDeviceCaps( hDC, LOGPIXELSX ) nDpi := GetDeviceCaps( hDC, LOGPIXELSX ) MsgInfo( LTRIM(STR(nDpi))+" DPI" ) ReleaseDC( 0, hDC ) RETURN nDpi //============================================================================ // FileName : SCROLL.PRG // Purpose : dialog Scroll Class // Author : Eric Yang // Update History : // Date Contents // ---------- --------------------------------------------------------------- // 1997.02.01 // 2006.29.12 By Rossini - Brasil //============================================================================ #include "FiveWin.ch" #ifndef TRUE #define TRUE .T. #define FALSE .F. #endif CLASS TScrDlg DATA oDlg DATA nVPos, nHPos METHOD New( oDlg,nV1,nV2,nH1,nH2 ) CONSTRUCTOR METHOD SetScroll( nV1,nV2,nH1,nH2 ) //-*------------------------------------------------------------ METHOD VScroll() METHOD VScrollThumb() METHOD VScrollTrack() METHOD VScrollPgDown() METHOD VScrollPgUp() //-*----------------------------- METHOD HScroll() METHOD HScrollThumb() METHOD HScrollTrack() METHOD HScrollPgDown() METHOD HScrollPgUp() ENDCLASS METHOD New( oDlg,nV1,nV2,nH1,nH2 ) CLASS TScrDlg ::nVPos := 0 ::nHPos := 0 ::oDlg := oDlg ::SetScroll( nV1,nV2,nH1,nH2 ) RETURN Self METHOD SetScroll( nV1,nV2,nH1,nH2 ) CLASS TScrDlg LOCAL aCoors1:={},aCoors2:={} //-------------------------------------------------- //-* Vertical Scroll Bar if ::oDlg:oVScroll != NIL ::oDlg:oVScroll:SetRange( nV1,nV2 ) ::nVPos := ::oDlg:oVScroll:GetPos() ::oDlg:oVScroll:bGoDown := {|| ::VScroll() } ::oDlg:oVScroll:bGoUp := {|| ::VScroll() } ::oDlg:oVScroll:bPageUp := {|| ::VScrollPgUp() } ::oDlg:oVScroll:bPageDown := {|| ::VScrollPgDown() } ::oDlg:oVScroll:bGoTop := {|| ::VScroll() } ::oDlg:oVScroll:bGoBottom := {|| ::VScroll() } ::oDlg:oVScroll:nPgStep := 10 //::oDlg:oVScroll:lReDraw := TRUE ::oDlg:oVScroll:bPos := {|nPos| ::VScrollThumb(nPos) } ::oDlg:oVScroll:bTrack := {|nPos| ::VScrollTrack(nPos) } endif //-------------------------------------------------- //-* Horizontal Scroll Bar if ::oDlg:oHScroll != NIL ::oDlg:oHScroll:SetRange( nH1,nH2 ) ::nHPos := ::oDlg:oHScroll:GetPos() ::oDlg:oHScroll:bGoDown := {|| ::HScroll() } ::oDlg:oHScroll:bGoUp := {|| ::HScroll() } ::oDlg:oHScroll:bPageUp := {|| ::HScrollPgUp() } ::oDlg:oHScroll:bPageDown := {|| ::HScrollPgDown() } ::oDlg:oHScroll:bGoTop := {|| ::HScroll() } ::oDlg:oHScroll:bGoBottom := {|| ::HScroll() } ::oDlg:oHScroll:nPgStep := 10 //::oDlg:oHScroll:lReDraw := TRUE ::oDlg:oHScroll:bPos := {|nPos| ::HScrollThumb(nPos) } ::oDlg:oHScroll:bTrack := {|nPos| ::HScrollTrack(nPos) } endif * ::oDlg:bKeyChar := {|nKey,nFlags| ScrollKey(nKey) } //-------------------------------------------------- RETURN( NIL ) /* STATIC FUNCTION ScrollKey(nKey) MsgInfo( "Key : "+str(nKey,10) ) //if nKey == K_ENTER // goMainDlg:End() // lRetVal := TRUE //endif RETURN( NIL ) */ //================================================================= //-* Vertical Scroll Bar METHOD VScroll() CLASS TScrDlg LOCAL nNewPos if ::nVPos >= ::oDlg:oVScroll:nMin ; .and. ::nVPos <= ::oDlg:oVScroll:nMax nNewPos := ::oDlg:oVScroll:GetPos() SysRefresh() ScrollWindow( ::oDlg:hWnd, 0, ; ( ::nVPos-nNewPos )*d_height, ; 0 , GetClientRect(::oDlg:hWnd) ) ::nVPos := nNewPos endif RETURN( NIL ) METHOD VScrollThumb(nNewPos) CLASS TScrDlg if ::nVPos >= ::oDlg:oVScroll:nMin ; .and. ::nVPos <= ::oDlg:oVScroll:nMax ::oDlg:oVScroll:SetPos(nNewPos) SysRefresh() ScrollWindow( ::oDlg:hWnd, 0, ; (::nVPos - nNewPos )*d_height, ; 0 , GetClientRect(::oDlg:hWnd) ) ::nVPos := nNewPos endif RETURN( NIL ) METHOD VScrollTrack(nNewPos) CLASS TScrDlg if ::nVPos >= ::oDlg:oVScroll:nMin ; .and. ::nVPos <= ::oDlg:oVScroll:nMax ::oDlg:oVScroll:SetPos(nNewPos) SysRefresh() ScrollWindow( ::oDlg:hWnd, 0, ; (::nVPos - nNewPos )*d_height, ; 0 , GetClientRect(::oDlg:hWnd) ) ::nVPos := nNewPos endif RETURN( NIL ) METHOD VScrollPgDown() CLASS TScrDlg LOCAL nNewPos if ::nVPos < ::oDlg:oVScroll:nMax nNewPos := ::nVPos + ::oDlg:oVScroll:nPgStep nNewPos := iif(nNewPos > ::oDlg:oVScroll:nMax, ::oDlg:oVScroll:nMax, nNewPos) SysRefresh() ScrollWindow( ::oDlg:hWnd, 0, ; ( ::nVPos - nNewPos )*d_height, ; 0 , GetClientRect(::oDlg:hWnd) ) ::nVPos := nNewPos endif RETURN( NIL ) METHOD VScrollPgUp() CLASS TScrDlg LOCAL nNewPos if ::nVPos > ::oDlg:oVScroll:nMin nNewPos := ::nVPos - ::oDlg:oVScroll:nPgStep nNewPos := iif(nNewPos < ::oDlg:oVScroll:nMin,::oDlg:oVScroll:nMin,nNewPos) SysRefresh() ScrollWindow( ::oDlg:hWnd, 0, ; ( ::nVPos - nNewPos )*d_height, ; 0 , GetClientRect(::oDlg:hWnd) ) ::nVPos := nNewPos endif RETURN( NIL ) //================================================================= //-* Horizontal Scroll Bar METHOD HScroll() CLASS TScrDlg LOCAL nNewPos if ::nHPos >= ::oDlg:oHScroll:nMin ; .and. ::nHPos <= ::oDlg:oHScroll:nMax nNewPos := ::oDlg:oHScroll:GetPos() SysRefresh() ScrollWindow( ::oDlg:hWnd, ; (::nHPos - nNewPos )*d_width,0, ; 0 , GetClientRect(::oDlg:hWnd) ) ::nHPos := nNewPos endif RETURN( NIL ) METHOD HScrollThumb(nNewPos) CLASS TScrDlg if ::nHPos >= ::oDlg:oHScroll:nMin ; .and. ::nHPos <= ::oDlg:oHScroll:nMax ::oDlg:oHScroll:SetPos(nNewPos) SysRefresh() ScrollWindow( ::oDlg:hWnd, ; (::nHPos - nNewPos )*d_width,0, ; 0 , GetClientRect(::oDlg:hWnd) ) ::nHPos := nNewPos endif RETURN( NIL ) METHOD HScrollTrack(nNewPos) CLASS TScrDlg if ::nHPos >= ::oDlg:oHScroll:nMin ; .and. ::nHPos <= ::oDlg:oHScroll:nMax ::oDlg:oHScroll:SetPos(nNewPos) SysRefresh() ScrollWindow( ::oDlg:hWnd, ; (::nHPos - nNewPos )*d_width,0, ; 0 , GetClientRect(::oDlg:hWnd) ) ::nHPos := nNewPos endif RETURN( NIL ) METHOD HScrollPgDown() CLASS TScrDlg LOCAL nNewPos if ::nHPos < ::oDlg:oHScroll:nMax nNewPos := ::nHPos + ::oDlg:oHScroll:nPgStep nNewPos := iif(nNewPos > ::oDlg:oHScroll:nMax, ::oDlg:oHScroll:nMax, nNewPos) SysRefresh() ScrollWindow( ::oDlg:hWnd, ; ( ::nHPos - nNewPos )*d_width,0, ; 0 , GetClientRect(::oDlg:hWnd) ) ::nHPos := nNewPos endif RETURN( NIL ) METHOD HScrollPgUp() CLASS TScrDlg LOCAL nNewPos if ::nHPos > ::oDlg:oHScroll:nMin nNewPos := ::nHPos - ::oDlg:oHScroll:nPgStep nNewPos := iif(nNewPos < ::oDlg:oHScroll:nMin,::oDlg:oHScroll:nMin,nNewPos) SysRefresh() ScrollWindow( ::oDlg:hWnd, ; ( ::nHPos - nNewPos )*d_width,0, ; 0 , GetClientRect(::oDlg:hWnd) ) ::nHPos := nNewPos endif RETURN( NIL ) //=* End of File =================================================
  16. Desejo força e paz à família enlutada. Que tenham também esperança (At 24:15)
  17. Olá, Eroni. Dá para disponibilizar seus exemplos do usa dessa DLL? E a também, sem querer abusar. Consegui ativar o ECF (Emulador) mas a Leitura X não vai. Alguém pode dar uma ajudinha aí? *--------------------( ECF via ACBrFramework32.dll )---------------------------* FUNCTION TestACBrFrwrk() aModelo := ; {; "01. NaoFiscal",; "02. Bematech",; "03. Sweda",; "04. Daruma",; "05. Schalter",; "06. Mecaf",; "07. Yanco",; "08. DataRegis",; "09. Urano",; "10. ICash",; "11. Quattro",; "12. FiscNET",; "13. Epson",; "14. NCR",; "15. SwedaSTX"; } cModelo := MsgSelect(aModelo, "02. Bematech", "Selecione o modelo", "&Ok", "Cancelar") cPorta := "COM4" IF ! MsgGet("Porta","Porta",@cPorta) RETURN NIL ENDIF xdll := LoadLibrary("ACBrFramework32.dll") nHandle := 0 ? "Cria o Handle do ECF" ret := ECFCreate(@nHandle) CheckResult(ret, nHandle) ? "Informa o modelo do ecf" nModelo := ALLTRIM(STR(VAL(LEFT(cModelo, 2)))) ret := ECFSetModelo(nHandle, nModelo) CheckResult(ret, nHandle) ? "Obtem o modelo configurado" buffer := ECFGetModelo(nHandle) SysRefresh() MsgAlert("Modelo: "+cValToChar(buffer)) ? "Define a porta de comunicação" ret := ECFSetPorta(nHandle, cPorta) CheckResult(ret, nHandle) ? "Obtem a porta de comunicação definida" buff := SPACE(100) ret = ECFGetPorta(nHandle, @buff, 100) CheckResult(ret, nHandle) ? "Verivicar se ECF está ativo" ret := ECFGetAtivo(nHandle) CheckResult(ret, nHandle) ? "Avtivar o ECF" ECFAtivar(nHandle) ? "Verivicar se ECF está ativo" ret := ECFGetAtivo(nHandle) CheckResult(ret, nHandle) ? "Emitir leitura X" ret := ECFLeituraX(nHandle) CheckResult(ret, nHandle) ? "Desativar o ECF" ret := ECFDestroy(@nHandle) CheckResult(ret, nHandle) FreeLib32(xdll) RETURN NIL STATIC FUNCTION CheckResult(ret, nHandle) LOCAL buff := SPACE(100) * ECFGetUltErro(nHandle, @buff, 100) SysRefresh() MsgInfo("Retorno: "+cValToChar(ret), "Aviso") RETURN NIL xdll:=LoadLibrary("ACBrFramework32.dll") DLL32 FUNCTION ECFCreate( @nHandle AS PTR ) AS 7 PASCAL FROM "ECF_Create" LIB xdll DLL32 FUNCTION ECFGetUltErro( ecfHandle AS PTR, @buffer AS 8, bufferLen AS STRING ) AS LONG PASCAL FROM "ECF_GetUltimoErro" LIB xdll DLL32 FUNCTION ECFSetModelo( nHandle AS PTR, cModelo AS STRING ) AS LONG PASCAL FROM "ECF_SetModelo" LIB xdll DLL32 FUNCTION ECFGetModelo( nHandle AS PTR ) AS LONG PASCAL FROM "ECF_GetModelo" LIB xdll DLL32 FUNCTION ECFGetModStr( nHandle AS PTR, @buffer AS STRING, bufferLen AS STRING ) AS LONG PASCAL FROM "ECF_GetModeloStr" LIB xdll DLL32 FUNCTION ECFSetPorta( nHandle AS PTR, porta AS STRING ) AS LONG PASCAL FROM "ECF_SetPorta" LIB xdll DLL32 FUNCTION ECFGetPorta( nHandle AS PTR, @buffer AS STRING, bufferLen AS STRING ) AS LONG PASCAL FROM "ECF_GetPorta" LIB xdll DLL32 FUNCTION ECFGetAtivo( nHandle AS PTR ) AS LONG PASCAL FROM "ECF_GetAtivo" LIB xdll DLL32 FUNCTION ECFAtivar( nHandle AS PTR ) AS LONG PASCAL FROM "ECF_Ativar" LIB xdll DLL32 FUNCTION ECFLeituraX( nHandle AS PTR ) AS 7 PASCAL FROM "ECF_LeituraX" LIB xdll DLL32 FUNCTION ECFDestroy( @nHandle AS PTR ) AS 7 PASCAL FROM "ECF_Destroy" LIB xdll freelibrary(xdll) *----------------------( Função MsgSelect )-----------------------------------* function MsgSelect( aItems, cValue, cTitle, cTitBt1, cTitBt2 ) LOCAL oDlg, lOk, cDescr, nScan DEFAULT cTitle := "Selecione" DEFAULT cTitBt1 := "&Ok" DEFAULT cTitBt2 := "Ca&ncelar" DEFAULT cValue := aItems[1] nScan := 1 cDescr := SPACE(40) lOk := .F. aItems := ASORT(aItems) DEFINE DIALOG oDlg FROM 5,10 TO 27, 54 TITLE cTitle @ 01,02 GET cDescr SIZE 145,10 OF oDlg ; ON CHANGE ( ::Assign() ,; cGet := SubStr( cDescr, 1, ::nPos - 1 ) ,; AEVAL(aItems ,{|cData,nItem| IIF( LEFT(cData,LEN(cGet)) = cGet, nScan:=nItem, nScan:=nScan)}),; oList:Select(nScan) ) @ 02,02 LISTBOX oList VAR cValue ITEMS aItems SIZE 145, 100 OF oDlg @ 08,07 BUTTON cTitBt1 OF oDlg SIZE 40, 12 ACTION (lOk := .T., oDlg:End()) DEFAULT @ 08,16 BUTTON cTitBt2 OF oDlg SIZE 40, 12 ACTION (lOk := .F., oDlg:End()) CANCEL ACTIVATE DIALOG oDlg CENTERED RETURN cValue
  18. Resolvido: // Pegar o total de registros nCount := 0 aArray := {} SqlArr := "SELECT COUNT(*) FROM itens_bd" aArray := SQLArray(SqlArr) IF LEN(aArray) > 0 nCount := aArray[1,1] ENDIF if nCount == 0 return nil endif // Pegar os itens em grupo de 20 ou menos, de acordo com a quantidade de registros na trabela. aVetor := {} // Limpa o Vetor nStep := IIF(nCount > 20, 20, nCount) FOR nStart := 1 TO nCount STEP nStep SqlArr := "SELECT CODIGO, DESCRI, PRVEN1, PRVEN2, PRVEN3"+; " FROM itens_bd"+; // Origem dos dados " LIMIT "+ALLTRIM(STR(nStart))+","+ALLTRIM(STR(nStep)) // Delimitador de registros (inicio,fim) TRY oSql := SR_GetConnection() nErr := oSql:Execute( SqlArr ) // Executar o comando em MySQL oSql:iniFields(.f.) // ??? aReturn := {} While ( oSql:Fetch( @aReturn ) == SQL_SUCCESS ) // Processar cada registro e salvar em aReturn aLinha := {} FOR nCol := 1 TO LEN(aReturn) // Pegar cada coluna de aReturn e salvar no array aLinha AADD(aLinha, aReturn[nCol]) NEXT AADD(aVetor, aLinha) // Salvar o array aLinha no vetor aVetor End CATCH oErr ? oErr:Description END NEXT xBrowse(aVetor, "Todos os registros") Obrigado a todos por mais essa força.
  19. Oi, Kleyber. A ideia é atualizar minha base de dados local a partir de uma tabela na internet. O problema é que a tabela contém muitos registros e pegar todos de uma vez demora, além de deixar o array muito tufado de registros. Por isso, pretendo pegar os registros em grupos de 20 por vez. Como não tenho nenhum campo com código sequencial, pretendo me basear no RECNO() da rabela. Já tentei assim do modo abaixo mas não deu certo. Embora leia a tabela tantas vezes forem necessário, sempre retorna todos os itens da tabala. // Pegar o total de registros nCount := 0 aArray := {} SqlArr := "SELECT COUNT(*) FROM itens_bd" aArray := SQLArray(SqlArr) IF LEN(aArray) > 0 nCount := aArray[1,1] ENDIF if nCount == 0 return nil endif // Pegar os itens em grupo de 20 ou menos, de acordo com a quantidade de registros na trabela. nStep := IIF(nCount > 20, 20, nCount) FOR nStart := 1 TO nCount STEP nStep aArray := {} SqlArr := "SELECT CODIGO, DESCRI, PRVEN1, PRVEN2, PRVEN3 "+; "FROM itens_bd"+; // Origem dos dados " LIMIT "+ALLTRIM(STR(nStart))+","+ALLTRIM(STR(nStep)) aArray := SQLArray(SqlArr) xBrowse(aArray, "Seleção atual") NEXT
  20. Fala, Jackson Douglas. Tô usando SqlRDD para conectar MySQL em um servidor da internet (Hotel da Web). Já encontrei e vou testar os exemplos deste link: http://en.wikipedia.org/wiki/Select_(SQL) Mas se você tiver algo pronto e funcional, fazer compartilhar. Grato.
  21. Olá, amigos. Tenho uma tabela de itens com mais de 1000 registros. Preciso ler toda esta tabela em grupos de 20 registros por vez. Qual o comando select para isso? Imaginei algo do tipo: FOR nRec := 1 TO RECCOUT() STEP 20 SELECT * FROM ITENS LIMIT nRec, 20 XBROWSE NEXT Claro que o exemplo acima é só para clarear as idéias e demonstrar melhor o que preciso, mas não sei se funciona. Alguém pode me ajudar?
  22. Olá, Gilmer. Espero ansiosamente pela Classe NF-e/NFC-e sem dependência da FlexDocs.dll. Se já tiver, envie proposta de preços para meu e-mail. ariston.ap@hotmail.com
×
×
  • Create New...