Bug Ano 2022

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

toya
Usuário Nível 3
Usuário Nível 3
Mensagens: 157
Registrado em: 26 Jul 2004 16:51
Localização: Campo Grande/MS - Brasil
Contato:

Bug Ano 2022

Mensagem por toya »

Para quem utiliza e/ou integra vossa aplicação com uma DLL Delphi na qual é utilizada a função FormatDateTime('yymmddhhmm', Now), deve estar se deparando com um erro do tipo: <numero> is not a valid integer value.
Adotei a seguinte solução, digo isto para quem tem acesso à recompilação da tal DLL:
Todo <idLote> que adota este controle sequencial via DLL será tratado como um parâmetro que será gerado pela minha aplicação.
Isto é em razão do <idLote> ser "Número seqüencial autoincremental único para identificação do Lote." conforme reza nos MOC de alguns DFe.

Podendo também, para quem achar util, utilizar a função abaixo para adotar como sequencial sem a exigência do "anterior + 1"...

Código: Selecionar todos


function BugAno2022Sequencial(dData, cTime)
// #toya: 04/01/2022 - 10:18:40 - JOB#NFe - Projeto Mrb

	local Result := .t.
	local n0 := 0
	local n1 := 0
	local n2 := 0
	local n31122021 := 211231
	local nDifBug := 0
	local cDia := ""
	local cMes := ""
	local cAno := ""
	local cData := ""
	local cHora := ""
	local cMinutos := ""

	DEFAULT dData := date()
	DEFAULT cTime := time()

	cDia := strzero(day(dData), 2, 0)
	cMes := strzero(month(dData), 2, 0)
	cAno := strzero(year(dData), 4, 0)
	cData := substr(cAno, 3) + cMes + cDia 
	cHora := left(cTime, 2)
	cMinutos := substr(cTime, 4, 2)

	if dData >= ctod("01/01/2022")
		n0 := val(cData)
		nDifBug := n0 - n31122021
		n1 := (n0 - nDifBug) + 1
		n2 := strzero(n1, 6, 0) + cHora + cMinutos
	else
		n2 := strzero(val(cData), 6, 0) + cHora + cMinutos
	endif 	
	
return n2 	


Elcio Carlos
(toya)
Ahora en la version 6.5
toyasis@gmail.com (e-mail)
toyaskype (skype)
http://www.toyanet.com.br
https://www.facebook.com/profile.php?id=100009195956044

FWH 11.8+PellesC+xHarbour.org 1.2.1+SqlRDD
Clippeiro por opção, Fivewiner por amor ao Clipper...
2015 - Iniciante/Aprendiz de HMG...
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Bug Ano 2022

Mensagem por JoséQuintas »

Isso me lembrou o SET EPOCH TO 1980.
Será que não tem algo parecido no Delphi?
Isso diz sobre qual ano considerar quando o ano contém 2 dígitos, e for maior do que o especificado.

Exemplo:

SET EPOCH TO 1950
Se colocar ano 51, vai considerar 1951, se colocar 49 vai considerar 2049

SET EPOCH TO 1960
Na mesma situação, vai considerar 2051 e 2049
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
toya
Usuário Nível 3
Usuário Nível 3
Mensagens: 157
Registrado em: 26 Jul 2004 16:51
Localização: Campo Grande/MS - Brasil
Contato:

Bug Ano 2022

Mensagem por toya »

Peço desculpa aos colegas, mas efetuei uns ajustes na função.
Segue a versão ajustada:

Código: Selecionar todos

unction BugAno2022Sequencial(dData, cTime)
// #toya: 05/01/2022 - 07:00:00 - JOB#NFe - Projeto Mrb

	local Result := ""
	local n0 := 0
	local n31122021 := 211231
	local nDifBug := 0
	local cDia := ""
	local cMes := ""
	local cAno := ""
	local cData := ""
	local cHora := ""
	local cMinutos := ""

	DEFAULT dData := date()
	DEFAULT cTime := time()

	cDia := strzero(day(dData), 2, 0)
	cMes := strzero(month(dData), 2, 0)
	cAno := strzero(year(dData), 4, 0)
	cData := substr(cAno, 3) + cMes + cDia 
	cHora := left(cTime, 2)
	cMinutos := substr(cTime, 4, 2)

	if dData >= ctod("01/01/2022")
		n0 := val(cData)
		nDifBug := n0 - n31122021
		Result := strzero(n31122021 + nDifBug - 8869, 6, 0) + cHora + cMinutos
	else
		Result := strzero(val(cData), 6, 0) + cHora + cMinutos
	endif 	
	
return Result 
Abaixo segue também uma função que retorna um array com a Data e Hora/Minuto do Sequencial:

Código: Selecionar todos

function BugAno2022RestDataHora(pcSequencial)
// #toya: 05/01/2022 - 07:00:00 - JOB#NFe - Projeto Mrb

	local Result := {ctod(""),"00:00:00"}
	local cAux := ""

	DEFAULT pcSequencial := ""

	pcSequencial := alltrim(pcSequencial)
	if len(pcSequencial) <> 10
		msgstop("Sequencial invalido.", "AVISO")
		return Result
	endif	
	cAux := left(pcSequencial, 6)
	if cAux <= "211231"
		Result := {ctod(substr(cAux, 5, 2) + "/" + substr(cAux, 3, 2) + "/" + "20" + left(cAux, 2)), substr(pcSequencial, 7, 2) + ":" + substr(pcSequencial, 9, 2) + ":00" }
	else 	
		Result := {ctod("31/12/2021") + val(cAux) - 211231, substr(pcSequencial, 7, 2) + ":" + substr(pcSequencial, 9, 2) + ":00" }
	endif 	

return Result  	

Elcio Carlos
(toya)
Ahora en la version 6.5
toyasis@gmail.com (e-mail)
toyaskype (skype)
http://www.toyanet.com.br
https://www.facebook.com/profile.php?id=100009195956044

FWH 11.8+PellesC+xHarbour.org 1.2.1+SqlRDD
Clippeiro por opção, Fivewiner por amor ao Clipper...
2015 - Iniciante/Aprendiz de HMG...
Responder