Ir para conteúdo
  • Cadastre-se

dev botao

jACBRframework


Ver Solução Respondido por Rafael Batiati,
  • Este tópico foi criado há 4295 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Boa tarde galera do ACBR!

Bom eu estou desenvolvendo um PAF-ECF usando JAVA, e não tem esses metodos na dll que eu tinha, eu até baixei uma dll que o pessoa da T2ti tinha colocado no site, deles que tem esses métodos, só que estava dando erro na venda de item, pois quando eu passava desconto, sempre saia como acrescimo,

daí eu baixai o JacbrFramework só que não esta rodando, eu chamo ele na minha aplicação ele fecha aplicação e dá uma mensagem da jvm.

até pensei em tentar implementar o JACBR_JNi, mas não sei que linguagem esta escrita, não é em lazaro!?


 public native void leituraMemoriaFiscal(String Inicial, String Final, boolean simpl) throws ACBrException;


    public native void leituraMemoriaFiscalCRZ(int Inicial, int Final, boolean simpl) throws ACBrException;


    public native void leituraMemoriaFiscalSerial(String Inicial, String Final, String NomeArquivo, boolean simpl) throws ACBrException;


    public native void leituraMemoriaFiscalSerialCRZ(int Inicial, int Final, String NomeArquivo, boolean simpl) throws ACBrException;


    public native void espelhoMFD(String Inicial, String Final, String NomeArquivo) throws ACBrException;


    public native void espelhoMFDCOO(int Inicial, int Final, String NomeArquivo) throws ACBrException;


    public native void arquivoMFD(String Inicial, String Final, String NomeArquivo) throws ACBrException;


    public native void arquivoMFDCOO(int Inicial, int Final, String NomeArquivo) throws ACBrException;


    public native void leituraMFDSerial(String Inicial, String Final, String NomeArquivo) throws ACBrException;


    public native void leituraMFDSerialCOO(int Inicial, int Final, String NomeArquivo) throws ACBrException;


    public native boolean getArredondaItemMFD() throws ACBrException;


    public native void setArredondaItemMFD(boolean arredondaItemMFD) throws ACBrException;


    public native boolean getArredondaPorQtd() throws ACBrException;


    public native void setArredondaPorQtd(boolean arredondaPorQtd) throws ACBrException;

alguém pode me ajudar?

Obrigado

  • Respostas 51
  • Created
  • Última resposta

Top Posters In This Topic

Postado

Boa tarde galera do ACBR!

Bom eu estou desenvolvendo um PAF-ECF usando JAVA, e não tem esses metodos na dll que eu tinha, eu até baixei uma dll que o pessoa da T2ti tinha colocado no site, deles que tem esses métodos, só que estava dando erro na venda de item, pois quando eu passava desconto, sempre saia como acrescimo,

daí eu baixai o JacbrFramework só que não esta rodando, eu chamo ele na minha aplicação ele fecha aplicação e dá uma mensagem da jvm.

até pensei em tentar implementar o JACBR_JNi, mas não sei que linguagem esta escrita, não é em lazaro!?

Alô, boa noite!!!

Sim, eu conheço o trabalho do pessoal da T2Ti, só que eles utilizam uma versão bem antiga do jACBr

Aliás, nós mudamos de nome, agora é jACBrFramework e a implementação nativa é feita pelo ACBrFramework_JNI.

Esse projeto ACBrFramework_JNI é escrito em C++ utilizando as interfaces nativas do Java (JNI) para fazer a comunicação entre a DLL e o Java.

Como nós não temos colaboradores em Java, com o passar do tempo a versão .Net do ACBrFramework teve muitos mais recursos implementados que a versão Java.

Você pode começar baixando a última versão do projeto pelo SVN e dando uma olhada geral.

Nosso repositório mudou também, está em https://acbr.svn.sourceforge.net/svnroo ... rFramework

***

É possível sim implementar o JNI usando Lazarus. Só que dentro do JDK só tem disponível as libs e .h para uso em C/C++, mas há uma forma de fazer o mesmo usando Lazarus.

http://javafree.uol.com.br/artigo/87149 ... elphi.html

Nós fizemos o JNI em C++ pois temos mais familiaridade com C++ e podemos usar as interfaces padrão de qualquer JDK.

***

Dê uma olhada em tudo, e poste aqui pra nós qualquer dúvida ou intenção que tenha de implementar algo.

Teremos o maior prazer em ajudar a tocar o jACBrFramework pra frente!

Abs!

Rafael Batiati

ACBrFramework - Automação comercial para todos.

MultiClubes - Soluções para a área de clubes, parques, lazer e entretenimento.

  • Solution
Postado

Bom eu estou desenvolvendo um PAF-ECF usando JAVA, e não tem esses metodos na dll que eu tinha, eu até baixei uma dll que o pessoa da T2ti tinha colocado no site, deles que tem esses métodos, só que estava dando erro na venda de item, pois quando eu passava desconto, sempre saia como acrescimo

Bom dia!

Pegue a última versão do projeto jACBrFramework, vai solucionar o problema de falha. Nós trocamos o namespace do projeto e não atualizamos em alguns pontos do JNI ... agora tá correto.

(...)

Eu conferi os métodos implementados no jACBrFramework, e realmente não constam os métodos acima que você listou.

Pode me confirmar se a versão da T2Ti possui esses métodos implementados? Caso positivo, vou entrar em contato com eles para ver se gostariam de colaborar com o projeto, ao invés de desenvolver uma versão isolada.

(...)

Chegou a olhar o código do JNI? O que achou? Qualquer dúvida, fique a vontade.

Abs.

Rafael Batiati

ACBrFramework - Automação comercial para todos.

MultiClubes - Soluções para a área de clubes, parques, lazer e entretenimento.

Postado

Boa noite Rafael.

então eu entrei com contato com o pessoal da T2Ti, eles implementaram isso em quarta, 26 janeiro 2011, 20:17 por Douglas Morato, eu testei esses métodos e funcionam perfeitamente.

eu pedi para ele se tinha esse fonte, ele falou que iria dar uma olhada se achasse ele me passaria, a minha intenção era pegar esse fonte e colocar na nova versão do JACR, e disponibilizar.

falei isso para eles, mas acho que ele não consegui encontrar ainda, por ainda não me respondeu.

Eu tenho um professor que é fera em C++ e delphi, pedi para ele me ajudar, daí gostaria de colaborar no projeto jacbr, eu dei uma olhada no JNI não parece ser difícil, estou esperando

o Douglas me responder, se ele achar o fonte ficaria mais fácil, eu tinha visto em algum lugar que ele tinha mandado para vocês no SVN, talvez se você puder dar uma olhada nessa data que te passei

para ver se tem algo.

parte do Forum onde eu pedi o fonte:


Atualização do jACBr

por douglas morato - quarta, 26 janeiro 2011, 20:17


 jACbr.rar

Boa Noite galera

Segue em anexo outra atualização do jACBr.

Foi atualizado as seguintes métodos do ECF

espelhoMFD_DLL

espelhoMFDCOO_DLL

arquivoMFD_DLL

arquivoMFDCOO_DLL

Também adicionei os métodos para controle de balanças.

Criado a Classe ACBrBAL, onde contém todos os métodos necessários para comunicação com balanças.

Att.

Douglas Morato

Responder


Re: Atualização do jACBr

por Valdemir Silveira - sexta, 9 novembro 2012, 12:51


Cara se você conseguir, será de grande ajuda, estou precisando muito disso.


Obrigado!

Mostrar principal | Responder


Re: Atualização do jACBr

por douglas morato - sexta, 9 novembro 2012, 11:30


Bom Dia Valdemir,


Vou verificar se ainda tenho as alterações que fiz do jACBr, lembro que não foi muito dificil não, pois o C++ abre no proprio Visual Studio e como sou programador Delphi a parte do delphi foi relativamente fácil.


Se eu achar o fontes eu compacto e ponho aqui no fórum.


Douglas Morato

Mostrar principal | Responder


Re: Atualização do jACBr

por Valdemir Silveira - sexta, 9 novembro 2012, 10:17


Bom dia Douglas, muito bom o seu trabalho com as dlls, incluindo essas funções, 

eu baixei elas e funcionou perfeitamente os métodos que você fez, porém no desconto na venda do item esta com erro, eu vi aqui que tinha um erro na dlls deles: http://www.djsystem.com.br/acbr/forum/viewtopic.php?f=19&t=5384&hilit=desconto+item+jacbr+desconto+item


em outro forum que eu postei : http://www.djsystem.com.br/acbr/forum/viewtopic.php?f=19&t=8070


eles falaram que a versão que vocês usaram é antiga e faltavam algumas funções você puder, pegar umas versões mais anteriores e incluir o metodo, ou se você puder passar o que você fez em C++, para incluir esses médotos, eu posso tentar ver se consigo incluir nas versões mais recentes do acbr.


Obrigado!


att.

Valdemir SIlveira

Postado

Fechou então,

Se está aqui no fórum deve ter um anexo também. Eu devo ter dado mole e não atualizado o SVN. Vou dar uma olhada nisso.

(...)

O JNI não é complicado, na verdade a implementação dos componentes é uma inversão do que é feito nas outras linguagens; Em C# por exemplo, nós declaramos só a assinatura da função nativa e implementamos toda sua chamada na classe em C#. No JNI nós temos que implementar tudo isso em C/C++ e no Java declaramos apenas sua assinatura. É um trabalho bem equivalente, mas depende apenas da facilidade que o programador tiver com cada linguagem.

Se você seguir o que já tem implementado como modelo fica fácil de fazer a maioria das funções.

Vou implementar o disparo de evento na classe Java pra servir de modelo também.

Se você tiver dúvida sobre alguma coisa é só postar aqui.

O projeto foi feito em Microsoft Visual C++, mas pode ser compilado em gcc, C++ Builder ou qualquer outro.

Abs!

Rafael Batiati

ACBrFramework - Automação comercial para todos.

MultiClubes - Soluções para a área de clubes, parques, lazer e entretenimento.

Postado

Como eu sei quais são os medotos que estão implementados no JACBR, porque estou tentando fazer o cancelamento parcial, e diz não foi implementado.

O Douglas ainda não me respondeu, eu cobrei ele ontem se ele tinha achado mas nem me respondeu, você conseguiu achar alguma coisa aí daquele negócio.

Deixa eu entender, no JACBR, ele só faz as chamadas dos metodos que estão implementados no ACBR?

Postado

Rafael, eu instalei o Microsoft Visual C++, 10

porém quando tento executar dá esse erro:

Build started 12/11/2012 19:37:17.

1>Project "E:\Projeto Arena\Programas Uteis\acbrNEstaveis\ACBrFramework\jACBrFramework\ACBrFramework_JNI\src\ACBrFramework_JNI.vcxproj" on node 2 (build target(s)).

1>InitializeBuildStatus:

Touching "Release\ACBrFramework_JNI.unsuccessfulbuild".

ClCompile:

C:\Arquivos de Programas\Microsoft Visual Studio 10.0\VC\bin\CL.exe /c /I..\include /I"C:\Program Files (x86)\Java\jdk1.6.0_31\include" /I"C:\Program Files (x86)\Java\jdk1.6.0_31\include\win32" /Zi /nologo /W3 /WX- /O2 /Oy- /GL /D WIN32 /D NDEBUG /D _CONSOLE /D _WINDLL /D _MBCS /Gm- /EHs /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fo"Release\\" /Fd"Release\vc100.pdb" /Gd /TP /analyze- /errorReport:prompt JACBrECF.cpp JNIHelper.cpp

JACBrECF.cpp

1>JACBrECF.cpp(3): fatal error C1083: Cannot open include file: 'jni.h': No such file or directory

JNIHelper.cpp

1>JNIHelper.cpp(3): fatal error C1083: Cannot open include file: 'jni.h': No such file or directory

1>Done Building Project "E:\Projeto Arena\Programas Uteis\acbrNEstaveis\ACBrFramework\jACBrFramework\ACBrFramework_JNI\src\ACBrFramework_JNI.vcxproj" (build target(s)) -- FAILED.

Build FAILED.

Time Elapsed 00:00:00.60

Postado

Legal, vejo que estamos indo bem!

Vamos lá:

1>JACBrECF.cpp(3): fatal error C1083: Cannot open include file: 'jni.h': No such file or directory

Você precisa setar o caminho do seu JDK, onde fica instalado o Java.

O compilador vai usar o jni.h e o linker vai usar o jvm.lib

No VS fica assim: Vá em propriedades do projeto, clique em "C/C++" e indique o caminho do include

post-394-13548988257932.jpg

Depois clique em "Linker", "Input" e indique o caminho do jvm.lib

post-394-13548988258175.jpg

Esses arquivos ficam sempre no diretório de instalação do JDK.

(...)

Eu posso compilar ele em Win 64

O java deve ser 32 ou 64 bits pode ser Java_7.

Sim, você pode compilar em 64bits; Mas note que pra fazer isso, você precisará referenciar a lib 64bits e o ACBrFramework64.dll.

No Java, também será necessário carregar o JNI correto, dependendo da plataforma, hoje é feito somente isso:

		

//Carrega a biblioteca de chamadas nativas JNI

System.loadLibrary("ACBrFramework_JNI");

Java 7 vai funcionar, qualquer versão igual ou superior ao JDK que você usou pra compilar o JNI vai funcionar.

(...)

Como eu sei quais são os medotos que estão implementados no JACBR, porque estou tentando fazer o cancelamento parcial, e diz não foi implementado.

Deixa eu entender, no JACBR, ele só faz as chamadas dos metodos que estão implementados no ACBR?

As funções disponíveis no ACBrFramework estão todas declaradas nos arquivos .h.

Enquanto na DLL as funções são estáticas, na classe Java temos os métodos declarados da forma OO, como classes que modelam o comportamento dos componentes o mais próximo possível do ACBr Delphi, para que possamos nos beneficiar dos exemplos, foruns, documentações, etc.

O jACBrFramework só faz chamadas ao que está implementado no JNI, que por sua vez foi exposto do componente ACBr.

(...)

O Douglas ainda não me respondeu, eu cobrei ele ontem se ele tinha achado mas nem me respondeu, você conseguiu achar alguma coisa aí daquele negócio.

Revisei os posts antigos, e não tem código-fonte em anexo.

Mas eu convido todos vocês interessados a participar aqui do fórum, e da evolução do jACBrFramework. Estou disponível para ajudar sempre.

Abs!

Rafael Batiati

ACBrFramework - Automação comercial para todos.

MultiClubes - Soluções para a área de clubes, parques, lazer e entretenimento.

Postado

Ok!

Rafael consegui compilar de boa no VS.

Para eu entender vamos pegar uma rotina por exemplo abrir cupom.

Eu criei uma classe no java chamada ECF.java


....

    public static ACBrECF ACBrECF;

.....


    public static void abreCumpo() {

        try {

            ACBrECF.abreCupom();

            statusEcf = ACBrECF.getEstado();

            mensagem();

        } catch (Throwable t) {

            logger.fatal(t.getMessage());

            JOptionPane.showMessageDialog(null, "Erro ocorrido: " + t.getMessage(), "Erro do Sistema", JOptionPane.ERROR_MESSAGE);

        }

    }

que chama la na classe ACBrECF.java

	public void abreCupom() throws ACBrException

	{

		abreCupom("","","");

	}

que por sua vez carrega a ACBrFramework_JNI.dll

que é feita em C++

que ele chama o arquivo JACBrECF.cpp?

ou o ele chama o arquico JACBrECF.h?

que no caso depois Chamaria o ACBrECF.h

que por sua vez iria chamar a ACBrFramework32.dll

onde esta implementado o abrircupom?

é mais ou menos isso?

Postado

eu uso uma impressora epson TM-T81F para o software.

e tem a função:

JNIEXPORT void JNICALL Java_jACBrFramework_ACBrECF_cancelaItemVendidoParcial(JNIEnv *env, jobject obj, jint numItem, jdouble quantidade);

no JACBrECF.h

porém quando chamo ele fiz que não foi implementado para epson, nesse caso como devo proceder.

Postado

Consegui fazer a LeituraMemoriaFiscalCRZ:

eu fiz o seguinte:

no arquivo JACBrEcf.cpp


JNIEXPORT void JNICALL Java_jACBrFramework_ACBrECF_leituraMemoriaFiscalCRZ(JNIEnv *env, jobject obj, jint inicial, jint final, jboolean simpl)

{

	INTPTR handle = GetACBrHandle(env, obj);	

	int ret = ECF_LeituraMemoriaFiscalReducao(handle, (int)inicial, (int)final, simpl);

	CheckResult(env, handle, ret);

}

no arquivo JACBrECF.h

JNIEXPORT void JNICALL Java_jACBrFramework_ACBrECF_leituraMemoriaFiscalCRZ(JNIEnv *env, jobject obj, jint inicial, jint final, jboolean simpl);

e na minha classe ACBRECF.java

    public native void leituraMemoriaFiscalCRZ(int Inicial, int Final, boolean simpl) throws ACBrException;

gerei a dll, coloquei na pasta

e funcionou, é só isso devo fazer?

Postado

Ok!

Rafael consegui compilar de boa no VS.

Excelente, vamos lá a sua pergunta:

Ok!

Eu criei uma classe no java chamada ECF.java


....

    public static ACBrECF ACBrECF;

.....


    public static void abreCumpo() {

        try {

            ACBrECF.abreCupom();

            statusEcf = ACBrECF.getEstado();

            mensagem();

        } catch (Throwable t) {

            logger.fatal(t.getMessage());

            JOptionPane.showMessageDialog(null, "Erro ocorrido: " + t.getMessage(), "Erro do Sistema", JOptionPane.ERROR_MESSAGE);

        }

    }

Ok, essa classe é sua aplicação, que na prática vai ser uma janela do seu PDV ou outra coisa parecida. Agora vamos ao jACBrFramework:
que chama la na classe ACBrECF.java

	public void abreCupom() throws ACBrException

	{

		abreCupom("","","");

	}

Sim, sua aplicação está chamando o método abreCupom() que no jACBrFramework possui um override que chama o método nativo abreCupom(cpfCnpj, nome, endereco) que não possui implementação, há apenas a declaração do que será feito via JNI, assim:

public native void abreCupom(String cpfCnpj, String nome, String endereco) throws ACBrException; 

Esse método nativo carrega o ACBrFramework_JNI.dll feito em C++, que chama a seguinte função:

JNIEXPORT void JNICALL Java_jACBrFramework_ACBrECF_abreCupom(JNIEnv *env, jobject obj, jstring cpfCnpj, jstring nome, jstring endereco);

Essa chamada ao JNI é feita por convenção de nomes, onde o nome da função precisa ser Java___(JNIEnv *env, jobject obj, ); Se o nome estiver diferente, ou os argumentos incorretos, não funciona... rsrsrs
que ele chama o arquivo JACBrECF.cpp? ou o ele chama o arquico JACBrECF.h?
O C funciona com o arquivo de header (.h) que contém apenas a declaração das funções, e o arquivo .cpp (ou .c) que contém a implementação. Assim, o JACBrECF.h e o JACBrECF.cpp são declaração e implementação das funções JNI do ECF.
que no caso depois Chamaria o ACBrECF.h que por sua vez iria chamar a ACBrFramework32.dll onde esta implementado o abrircupom?
é a implementação da função Java_jACBrFramework_ACBrECF_abreCupom que fica no JACBrECF.cpp que chama o ACBrFramework32.dll, utilizando o arquivo ACBrECF.h que contém as declarações das funções que existem no ACBrFramework32.dll; Assim:

JNIEXPORT void JNICALL Java_jACBrFramework_ACBrECF_abreCupom(JNIEnv *env, jobject obj, jstring cpfCnpj, jstring nome, jstring endereco)

{

	INTPTR handle = GetACBrHandle(env, obj);


	jboolean isCopy = (jboolean)false;


	const char* nCpfCnpj = env->GetStringUTFChars(cpfCnpj, &isCopy);

	const char* nNome = env->GetStringUTFChars(nome, &isCopy);

	const char* nEndereco = env->GetStringUTFChars(endereco, &isCopy);


        //CHAMADA DA FUNÇÃO DECLARADA NO ACBrECF.h e IMPLEMENTADA PELA ACBrFramework32.dll

	int ret = ECF_AbreCupom(handle, (PCHAR)nCpfCnpj, (PCHAR)nNome, (PCHAR)nEndereco);


	env->ReleaseStringUTFChars(cpfCnpj, nCpfCnpj);

	env->ReleaseStringUTFChars(nome, nNome);

	env->ReleaseStringUTFChars(endereco, nEndereco);


	CheckResult(env, handle, ret);

}

Note no código acima a chamada a função ECF_AbreCupom que foi implementada em Delphi, usando diretamente o componente ACBr.

É mais ou menos isso.

Abs!

Rafael Batiati

ACBrFramework - Automação comercial para todos.

MultiClubes - Soluções para a área de clubes, parques, lazer e entretenimento.

Postado

eu uso uma impressora epson TM-T81F para o software.

e tem a função:

JNIEXPORT void JNICALL Java_jACBrFramework_ACBrECF_cancelaItemVendidoParcial(JNIEnv *env, jobject obj, jint numItem, jdouble quantidade);

no JACBrECF.h

porém quando chamo ele fiz que não foi implementado para epson, nesse caso como devo proceder.

Nesse caso, acho que o próprio componente ACBr não possui a implementação para a EPSON.

Precisamos verificar isso.

Rafael Batiati

ACBrFramework - Automação comercial para todos.

MultiClubes - Soluções para a área de clubes, parques, lazer e entretenimento.

  • Consultores
Postado

Veja esse link:

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Postado

Consegui fazer a LeituraMemoriaFiscalCRZ:

eu fiz o seguinte:

(...)

gerei a dll, coloquei na pasta e funcionou, é só isso devo fazer?

Exatamente, só isso que deve fazer! É realmente simples, não acha?

Essa função é simples, não tem argumentos nem retorno. Fique atento a funções mais complexas que trabalham com string e outros objetos que precisam ser removidos da memória. Sempre procure uma função semelhante já implementada pra tomar como modelo.

E não se esqueça de detalhar num TXT as coisas que você implementou, pra depois nós atualizarmos o SVN.

Abs!

Rafael Batiati

ACBrFramework - Automação comercial para todos.

MultiClubes - Soluções para a área de clubes, parques, lazer e entretenimento.

  • Consultores
Postado

Veja esse link:

Desculpa, não fui claro ...

Acho que o ACBr não possui a implementação do método cancelaItemVendidoParcial para o Ecf EPSON.

Poderia confirmar isso pra gente?

Não possui mesmo. Nem sei se suporta. Acho que só a Daruma tem esse método implementado.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
  • 2 semanas depois ...
Postado

Bom dia!

eu implementei a ECF_LeituraMemoriaFiscalData em Jacbrframework em c++, eu vi que ele passa 2 double para dataInicial e dataFinal, daí eu fiz isso no java:

OBS: A MINHA ECF ESTA COM DATA DE 2013, DEVIDO AS INTERVENÇÃO QUE FORAM FEITAS

Código:

Calendar calInicio = Calendar.getInstance();

calInicio.set(Calendar.DAY_OF_MONTH, 1);

calInicio.set(Calendar.MONTH, 1);

calInicio.set(Calendar.YEAR, 2013);

double dtInicio = calInicio.getTimeInMillis();

Calendar calFinal = Calendar.getInstance();

calFinal.set(Calendar.DAY_OF_MONTH, 1);

calFinal.set(Calendar.MONTH, 2);

calFinal.set(Calendar.YEAR, 2013);

double dtFinal = calFinal.getTimeInMillis();

Ecf.leituraMemoriaFiscal(dtInicio, dtFinal, false);

O dtIncio fica assim : 1.359718346497E12

O dtFinal fica assim : 1.362141198811E12

porém ele me retorna:

Erro retornado pela Impressora: Epson

Erro: 020C - Campo data inválido.

por que retorna esse erro?

por redução ele funciona de boa.

Obrigado!

Postado

Existe no projeto jACBrFramework a classe Util que tem o método doubleToDate que converte um double para um java.util.Date (as datas no Delphi são armazenadas como um double no padrão OLE).

Até o ponto que eu implementamos, não tínhamos nenhum método que recebia um Date como argumento, então não chegamos a fazer a função em contraparte dateToDouble

Você pode implementar essa função dateToDouble na classe Util, fazendo o inverso da regra implementada em doubleToDate.

Só atente ao fato de que é o JNI que chama essa função, no código Java você sempre deve trabalhar com os tipos de alto nível, ou seja usar um java.util.Date ao invés de usar o double.

Dá uma olhada em qualquer função do JNI que retorna data, por exemplo, a Java_jACBrFramework_ACBrECF_getDataHora.

Ela usa a função GetDate implementada em JNIHelper.cpp no projeto JNI.

Essa GetDate faz uso do método estático Util.doubleToDate para converter o double para java.util.Date, expondo ao Java apenas o tipo correto Date, e nunca o double.

Esses métodos Get e Set do JNIHelper são auxiliares para operações comuns de get e set em propriedades dos componentes. Eles acessam via ponteiros de função os métodos com assinaturas já padronizadas, economizando muito código na implementação deles.

No seu caso você pode até fazer um SetDate no JNIHelper para usar futuramente em propriedades que setam datas,

mas como seu objetivo atual é usar a função ECF_LeituraMemoriaFiscalData, poderá fazer algum outro método no JNIHelper que permita usar apenas o Util.doubleToDate diretamente, sem envolver os ponteiros de função, já que a assinatura da função em questão é muito específica.

Qualquer dúvida, posta aqui pra gente.

E depois pode anexar seu código para atualizarmos o SVN com esses métodos.

Abs,

Rafael Batiati

ACBrFramework - Automação comercial para todos.

MultiClubes - Soluções para a área de clubes, parques, lazer e entretenimento.

Postado

Existe no projeto jACBrFramework a classe Util que tem o método doubleToDate que converte um double para um java.util.Date (as datas no Delphi são armazenadas como um double no padrão OLE).

Até o ponto que eu implementamos, não tínhamos nenhum método que recebia um Date como argumento, então não chegamos a fazer a função em contraparte dateToDouble

Você pode implementar essa função dateToDouble na classe Util, fazendo o inverso da regra implementada em doubleToDate.

Só atente ao fato de que é o JNI que chama essa função, no código Java você sempre deve trabalhar com os tipos de alto nível, ou seja usar um java.util.Date ao invés de usar o double.

Dá uma olhada em qualquer função do JNI que retorna data, por exemplo, a Java_jACBrFramework_ACBrECF_getDataHora.

Ela usa a função GetDate implementada em JNIHelper.cpp no projeto JNI.

Essa GetDate faz uso do método estático Util.doubleToDate para converter o double para java.util.Date, expondo ao Java apenas o tipo correto Date, e nunca o double.

Esses métodos Get e Set do JNIHelper são auxiliares para operações comuns de get e set em propriedades dos componentes. Eles acessam via ponteiros de função os métodos com assinaturas já padronizadas, economizando muito código na implementação deles.

No seu caso você pode até fazer um SetDate no JNIHelper para usar futuramente em propriedades que setam datas,

mas como seu objetivo atual é usar a função ECF_LeituraMemoriaFiscalData, poderá fazer algum outro método no JNIHelper que permita usar apenas o Util.doubleToDate diretamente, sem envolver os ponteiros de função, já que a assinatura da função em questão é muito específica.

Qualquer dúvida, posta aqui pra gente.

E depois pode anexar seu código para atualizarmos o SVN com esses métodos.

Abs,

Rafael Batiati

ACBrFramework - Automação comercial para todos.

MultiClubes - Soluções para a área de clubes, parques, lazer e entretenimento.

Postado

Dá uma olhada nesse artigo da Microsoft,

http://support.microsoft.com/kb/169795/pt?wa=wsignin1.0

Ele tem o código fonte completo de um OleDate, herdando de java.Util.Data,

não precisamos de tanto, mas tem a clara implementação do método toDouble que é exatamente o que precisamos.

Vê aí se vc consegue,

Qualquer coisa, no fim de semana eu dou uma olhada nisso.

Abs,

Rafael Batiati

ACBrFramework - Automação comercial para todos.

MultiClubes - Soluções para a área de clubes, parques, lazer e entretenimento.

Postado

Deu certo Obrigado!


static int rgMonthDays[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};


    public static double toDouble(LocalDateTime date) {

        // source code copied from MFC 4.21 and modified.


        int wYear = date.getYear();

        int wMonth = date.getMonthOfYear();

        int wDay = date.getDayOfMonth();

        int wHour = date.getHourOfDay();

        int wMinute = date.getMinuteOfHour();

        int wSecond = date.getSecondOfMinute();


        //  Check for leap year and set the number of days in the month

        boolean bLeapYear = ((wYear & 3) == 0)

                && ((wYear % 100) != 0 || (wYear % 400) == 0);


        int nDaysInMonth =

                rgMonthDays[wMonth] - rgMonthDays[wMonth - 1]

                + ((bLeapYear && wDay == 29 && wMonth == 2) ? 1 : 0);


        // Cache the date in days and time in fractional days

        long nDate;

        double dblTime;


        //It is a valid date; make Jan 1, 1AD be 1

        nDate = wYear * 365L + wYear / 4 - wYear / 100 + wYear / 400

                + rgMonthDays[wMonth - 1] + wDay;


        //  If leap year and it's before March, subtract 1:

        if (wMonth >= 2 && bLeapYear) {

            --nDate;

        }


        //  Offset so that 12/30/1899 is 0

        nDate -= 693959L;


        dblTime = (((long) wHour * 3600L) + // hrs in seconds

                ((long) wMinute * 60L) + // mins in seconds

                ((long) wSecond)) / 86400.;


        double dtDest = (double) nDate

                + ((nDate >= 0) ? dblTime : -dblTime);


        return dtDest;

    }

Postado

Show de bola, isso aí mesmo.

Essa função vc usa do lado do JNI e já expõe ao java o parametro como um java.Util.Date.

Terminando aí vc me dá um alô pra eu olhar o código e atualizar aqui no SNV, blz?

Abraços.

Rafael Batiati

ACBrFramework - Automação comercial para todos.

MultiClubes - Soluções para a área de clubes, parques, lazer e entretenimento.

  • Este tópico foi criado há 4295 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas

×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.