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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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