MVC GPEA003 - Co-Participação/Reembolso

Desenvolvi uma rotina automática MVC da rotina GPEA003. Esta funcionando e inclui os dados na tabela RHO. Mas, ao incluir mais de um dado de um mesmo colaborador de forma sequencial (exemplo: titular e dependente), a tecnologia esta substituindo o primeiro dado cadastrado pelo último que esta sendo cadastrado, ao invés de incluir um novo cadastro e deixar os dois cadastrados na tabela RHO.

Algum colega desenvolvedor, teve experiência com esta inconsistência e sabe como elliminar ?

A seguir meu código para análise dos colegras e orientação de como eliminar a inconsistêcia :

#include "totvs.ch"
#include "fwmvcdef.ch"

user function mvcgpea003(fllant,clbmat,ocrdat,dpnorg,frntip,depdcdg,frncdg,vrbcdg,coprtvlr,cmppgtdat,prcobs,prtcpf,prsnom)
// incluir no cadastro 'co-participacao' os dados do titular, dependente
    local getare := FWGetArea()
    local mdl := nil
    Private cFilOld	:= fllant

    dbselectarea("SRA")
    dbsetorder(1) // RA_FILIAL+RA_MAT
    msSeek(fllant+clbmat,.T.) // posiciona no colaborador cuja co-participacao sera registrada

    mdl := FWLoadModel("GPEA003")
    mdl:SetOperation(MODEL_OPERATION_INSERT)
    mdl:Activate()
    mdl:SetValue("GPEA003_MRHO","RHO_FILIAL",fllant   ) // C  Filial Colabordor - Campo oculto em janela ao usuario
    mdl:SetValue("GPEA003_MRHO","RHO_DTOCOR",ocrdat   ) // D-C Data Ocorrrencia : 'DT AUTORIZACAO (366,375) no arquivo'
    mdl:SetValue("GPEA003_MRHO","RHO_ORIGEM",dpnorg   ) // C  Origem : 1-Titular ou 2-Dependente 'conforme identificado cpf no cadastro 'Funcionario' ou 'Dependentes' de acordo com matricula x cpf'
    mdl:SetValue("GPEA003_MRHO","RHO_TPFORN",frntip   ) // C Tipo : fixo '1'-Assistencia Medica
    mdl:SetValue("GPEA003_MRHO","RHO_CODIGO",depdcdg  ) // C Tipo : trazer codigo da SRB conforme cpf informado
    mdl:SetValue("GPEA003_MRHO","RHO_CODFOR",frncdg   ) // C Cod Fornec
    mdl:SetValue("GPEA003_MRHO","RHO_TPLAN" ,'1'      ) // C Tipo Lancam : fixo '1'-Co-participacao
    mdl:SetValue("GPEA003_MRHO","RHO_PD"    ,vrbcdg   ) // C Verba Calcul conforme registrado no cadastro SubStr(RCC_CONTEU,174,3) titular, SubStr(RCC_CONTEU,177,3) dependente
    mdl:SetValue("GPEA003_MRHO","RHO_VLRFUN",coprtvlr ) // N Vlr Funcion : 'VL PARTICIPACAO (501,510)' no arquivo texto
    mdl:SetValue("GPEA003_MRHO","RHO_VLREMP",0.00     ) // N Vlr Empresa : fixo 0.00
    mdl:SetValue("GPEA003_MRHO","RHO_COMPPG",cmppgtdat) // C Compet Pagto : DT VENCIMENTO (036,045) somente o ano e mes 'AAAAMM' ou considera data ultimo periodo aberto no cadastro 'Periodos'
    mdl:SetValue("GPEA003_MRHO","RHO_OBSERV",prcobs   ) // C Observacoes : 'PROCEDIMENT0 (381,440) no arquivo'
    //mdl:SetValue("GPEA003_MRHO","RHO_CPF"   ,prtcpf   ) // C CPF/CNPJ : 'CPF (231,241) no arquivo' obs: gatilho preenche automaticamente
    mdl:SetValue("GPEA003_MRHO","RHO_NOMED" ,prsnom   ) // C Nome Prest S : 'PRESTADOR (441,500) no arquivo'
    mdl:SetValue("GPEA003_MRHO","RHO_TPATEN","12"     ) // Tipo Atend : fixo 12
    if mdl:VldData()
    // se o conjunto de dados a ser gravado estiver correto
        mdl:CommitData() // confirma gravacao na tabela
    else
    // caso contrario exibe mensagem informacao o possivel motivo de nao gravar os dados
        VarInfo("Insert Error",mdl:GetErrorMessage())
    endif
    mdl:DeActivate()
    // limpar memoria computacional
    mdl:Destroy()
    mdl := nil
    // retornar area de trabalho
    FWRestArea(getare)
return nil

Muito Obrigado :slightly_smiling_face:

Bom dia,
Desenvolvi uma rotina idêntica a sua
Segue trecho do meu código, talvez possa lhe ajudar

    Static Function ExecGeraCPR(aCodFor, cMat, cDepend, nVlCola, nVlEmpr ,nQuantParc, cCodSSM)
	****************************************************************

	Local lDeuCerto	:= .F.
	Local dDtOcorr	:= dDataBase
	Local nI		:= 0
	Local cObserv	:=  "SSM: " + cCodSSM 
	Local aErro		:= {}
	Local nlinha	:= 1
	Local aArea	    := GetArea()
	Local aArea2	:= GetArea()

	Private cFilOld	:= cFilAnt

	nQuantParc := IIF(nQuantParc == 0, 1, nQuantParc)

	DbSelectArea('SRA')
	SRA->(DbSetOrder(1)) //RA_FILIAL + RA_MAT + RA_NOME

//Somente se não encontrar Produto x Cliente irá cair dentro da condição
	If SRA->(DbSeek(FWxFilial('SRA') + cMat))

		//Instanciando a rotina GPEA003, buscando o model dos campos da GPEA003_MRHO e definindo a operação como inclusão
		oModel := FWLoadModel("GPEA003")
		oRHOMod := oModel:GetModel("GPEA003_MRHO")
		oModel:SetOperation(3) //1, 3, 4, 5, 6
		oModel:Activate()
		for nI := 1 To nQuantParc
			aArea2 := GetArea()

			BeginSql Alias "SQL_DTCPR"
				SELECT
					RHO.RHO_DTOCOR,
					RHO.RHO_CODFOR,
					RHO.RHO_ORIGEM
				FROM
					%table:RHO% RHO
				WHERE RHO_MAT = %exp:cMat%
				//   AND RHO.%notDel%
				ORDER BY
					RHO.RHO_DTOCOR ASC
				// 	RHO.R_E_C_N_O_ DESC
			EndSql

			DbSelectArea("SQL_DTCPR")
			if alltrim(oRHOMod:ADATAMODEL[1][1][1][5]) <> ''
				oRHOMod:addline()
				nLinha := oRHOMod:Length()
				oRHOMod:setline(nLinha)
				DbSelectArea("SQL_DTCPR")

				while SQL_DTCPR->(!EOF()) 
					// IF SQL_DTCPR->RHO_DTOCOR == GRAVADATA(dDtOcorr,.F.,8) .AND. nI == 1 TIC#10666 Erro ao fazer Integração
					IF SQL_DTCPR->RHO_DTOCOR == GRAVADATA(dDtOcorr,.F.,8) .AND. SQL_DTCPR->RHO_CODFOR == aCodFor[1] .AND. SQL_DTCPR->RHO_ORIGEM == IIF(ALLTRIM(cDepend) == "","1","2")
						dDtOcorr := DaySum(dDtOcorr, 1)
					ENDIF
					SQL_DTCPR->(dbSkip())
				ENDDO
			endif
			IF nQuantParc > 1
				IF nI <> 1
					dDtOcorr := MonthSum(dDtOcorr, 1)
					WHILE SQL_DTCPR->(!EOF())
						IF SQL_DTCPR->RHO_DTOCOR == GRAVADATA(dDtOcorr,.F.,8)
							dDtOcorr := DaySum(dDtOcorr, 1)
						ENDIF
					ENDDO
				endif
				cObserv := "SSM: " + cCodSSM + " PARCELA " + cValToChar(nI) + " / " + cValToChar(nQuantParc)
			ENDIF
			SQL_DTCPR->(DBCloseArea())
			RestArea(aArea2)
			
			oRHOMod:setValue("RHO_DTOCOR",  dDtOcorr 		)
			oRHOMod:setValue("RHO_ORIGEM",  IIF(ALLTRIM(cDepend) == "","1","2")		)
			oRHOMod:setValue("RHO_TPFORN",  "1" 		)
			oRHOMod:setValue("RHO_CODFOR",  aCodFor[1]	) 		
			IF alltrim(cDepend) <> ''
				oRHOMod:setValue("RHO_CODIGO",  ALLTRIM(cDepend) 		)
			endif 
			oRHOMod:setValue("RHO_TPLAN",  "1" 		)
			oRHOMod:setValue("RHO_VLRFUN",  (nVlCola / nQuantParc)       	)
			oRHOMod:setValue("RHO_PD"	 ,  IIF(ALLTRIM(cDepend) == "" ,"D05","D06")      	)
			oRHOMod:setValue("RHO_VLREMP",  IIF(nI <> 1,0,nVlEmpr)       	)
			oRHOMod:setValue("RHO_COMPPG",  SUBSTR(GRAVADATA(dDtOcorr,.F.,8),1,6)      	)
			oRHOMod:setValue("RHO_OBSERV",  cObserv       	)
			
		next nI
		
		

		//Tenta validar as informações e realizar o commit
		If oModel:VldData()
			IF oModel:CommitData()
				lDeuCerto := .T.
			ENDIF
		EndIf
		//Se não deu certo a operação de inclusão
		If ! lDeuCerto
			//Busca o Erro do Modelo de Dados
			aErro := oModel:GetErrorMessage()

			//Monta o Texto que será mostrado na tela
			AutoGrLog("Id do formulário de origem:"  + ' [' + AllToChar(aErro[01]) + ']')
			AutoGrLog("Id do campo de origem: "      + ' [' + AllToChar(aErro[02]) + ']')
			AutoGrLog("Id do formulário de erro: "   + ' [' + AllToChar(aErro[03]) + ']')
			AutoGrLog("Id do campo de erro: "        + ' [' + AllToChar(aErro[04]) + ']')
			AutoGrLog("Id do erro: "                 + ' [' + AllToChar(aErro[05]) + ']')
			AutoGrLog("Mensagem do erro: "           + ' [' + AllToChar(aErro[06]) + ']')
			AutoGrLog("Mensagem da solução: "        + ' [' + AllToChar(aErro[07]) + ']')
			AutoGrLog("Valor atribuído: "            + ' [' + AllToChar(aErro[08]) + ']')
			AutoGrLog("Valor anterior: "             + ' [' + AllToChar(aErro[09]) + ']')

			//Mostra a mensagem de Erro
			FWAlertErro("Erro Gerado : "+AllToChar(aErro[06])+ "campo de origem: "+aErro[04],"ExecGeraCPR")
		EndIf

		
		//Por fim, desativa o modelo de dados
		oModel:DeActivate()
		RestArea(aArea)
	EndIf

return ! lDeuCerto
	***********************************************************************

edit: Em meu cenario atual, função esta preparada para aceitar parcelamento de descontos medicos
obs: lembrando que fornecedor precisa estar vinculado ao funcionario na GPEA001

1 curtida

@claudinei.nascimento você precisa incluir novas linhas na grid, uma para cada lançamento novo. Lembrando de ao adicionar verificar se não ocorreu erro, despois de adicionar a linha é só preencher os dados. Segue mais ou menos como deve ficar o trecho:

				If .Not. Empty(oGrd:GetValue("RHO_DTOCOR"))
					nTamGD	:= oGrd:Length()
					If oGrd:AddLine() == nTamGD		//-- Erro ao adicionar linha
						lMVC_OK	:= .F.
						Exit
					EndIf
					nTamGD	:= oGrd:Length()
				EndIf
				... PREENCHER OS CAMPOS AQUI
1 curtida

@rian seu código me ajudou muito! Inclui nova linha antes de iniciar gravação. Fiz um pouco diferente, mas funcionou.
Muito Obrigado!

Adequei meu código incluindo nova linha e funcionou.
Muito Obrigado!

A seguir código adequado e funcionando, após instruções do sr @rian e @cirilorocha

user function mvcgpea003(fllant,clbmat,ocrdat,dpnorg,frntip,depdcdg,frncdg,vrbcdg,coprtvlr,cmppgtdat,prcobs,prtcpf,prsnom)
// incluir no cadastro 'co-participacao' os dados do titular, dependente
    local getare := FWGetArea()
    local mdl := nil
    local alsnxtrho := GetNextAlias()
    local lnhadc := 0
    Private cFilOld	:= fllant

    dbselectarea("SRA")
    dbsetorder(1) // RA_FILIAL+RA_MAT
    msSeek(fllant+clbmat,.T.) // posiciona no colaborador cuja co-participacao sera registrada

    mdl := FWLoadModel("GPEA003")
    mdl:SetOperation(MODEL_OPERATION_INSERT)
    mdl:Activate()

    // se ja importado ao cadastro Co-Participacao/reembolso
    beginsql alias alsnxtrho
        %noParser%
        SELECT RHO.RHO_MAT
        FROM %table:RHO% RHO
        WHERE RHO.%notDel% AND RHO.RHO_FILIAL=%exp:fllant% AND RHO.RHO_MAT=%exp:clbmat% AND RHO.RHO_COMPPG=%exp:cmppgtdat%
            AND RHO.RHO_TPFORN=%exp:frntip% AND RHO.RHO_CODFOR=%exp:frncdg%
    endsql
    if !Empty(AllTrim((alsnxtrho)->RHO_MAT))
    // se registro existir registro conforme RHO_FILIAL+RHO_MAT+DTOS(RHO_DTOCOR)+RHO_TPFORN+RHO_CODFOR
        mdl:GetModel("GPEA003_MRHO"):AddLine()
        lnhadc := mdl:GetModel("GPEA003_MRHO"):Length()
        mdl:GetModel("GPEA003_MRHO"):setLine(lnhadc)
    endif
    (alsnxtrho)->(DbCloseArea()) // fechar alias para permitir nova leitura

    mdl:SetValue("GPEA003_MRHO","RHO_FILIAL",fllant   ) // C  Filial Colabordor - Campo oculto em janela ao usuario
    mdl:SetValue("GPEA003_MRHO","RHO_DTOCOR",ocrdat   ) // D-C Data Ocorrrencia : 'DT AUTORIZACAO (366,375) no arquivo'
    mdl:SetValue("GPEA003_MRHO","RHO_ORIGEM",dpnorg   ) // C  Origem : 1-Titular ou 2-Dependente 'conforme identificado cpf no cadastro 'Funcionario' ou 'Dependentes' de acordo com matricula x cpf'
    mdl:SetValue("GPEA003_MRHO","RHO_TPFORN",frntip   ) // C Tipo : fixo '1'-Assistencia Medica
    mdl:SetValue("GPEA003_MRHO","RHO_CODIGO",depdcdg  ) // C Tipo : trazer codigo da SRB conforme cpf informado
    mdl:SetValue("GPEA003_MRHO","RHO_CODFOR",frncdg   ) // C Cod Fornec
    mdl:SetValue("GPEA003_MRHO","RHO_TPLAN" ,'1'      ) // C Tipo Lancam : fixo '1'-Co-participacao
    mdl:SetValue("GPEA003_MRHO","RHO_PD"    ,vrbcdg   ) // C Verba Calcul conforme registrado no cadastro SubStr(RCC_CONTEU,174,3) titular, SubStr(RCC_CONTEU,177,3) dependente
    mdl:SetValue("GPEA003_MRHO","RHO_VLRFUN",coprtvlr ) // N Vlr Funcion : 'VL PARTICIPACAO (501,510)' no arquivo texto
    mdl:SetValue("GPEA003_MRHO","RHO_VLREMP",0.00     ) // N Vlr Empresa : fixo 0.00
    mdl:SetValue("GPEA003_MRHO","RHO_COMPPG",cmppgtdat) // C Compet Pagto : DT VENCIMENTO (036,045) somente o ano e mes 'AAAAMM' ou considera data ultimo periodo aberto no cadastro 'Periodos'
    mdl:SetValue("GPEA003_MRHO","RHO_OBSERV",prcobs   ) // C Observacoes : 'PROCEDIMENT0 (381,440) no arquivo'
    //mdl:SetValue("GPEA003_MRHO","RHO_CPF"   ,prtcpf   ) // C CPF/CNPJ : 'CPF (231,241) no arquivo' obs: gatilho preenche automaticamente
    mdl:SetValue("GPEA003_MRHO","RHO_NOMED" ,prsnom   ) // C Nome Prest S : 'PRESTADOR (441,500) no arquivo'
    mdl:SetValue("GPEA003_MRHO","RHO_TPATEN","12"     ) // Tipo Atend : fixo 12
    if mdl:VldData()
    // se o conjunto de dados a ser gravado estiver correto
        mdl:CommitData() // confirma gravacao na tabela
    else
    // caso contrario exibe mensagem informacao o possivel motivo de nao gravar os dados
        VarInfo("Insert Error",mdl:GetErrorMessage())
    endif
    mdl:DeActivate()
    mdl:Destroy()
    mdl := nil

    // clear computacional memomy
    FWRestArea(getare)
return nil