#Include "protheus.ch" //Importación de formas de pago a partir de archivo .CSV al modelo SEL_DETAIL (formas de pago de la tabla SEL) //Ejemplo de registro en el archivo .CSV : NUMTITULO;BANCODESCRIPCION;;;20/09/2024;21/09/2024;01000 User Function FN998CARGA(oModel) //Nota: En Totvs Recibo (FINA998), las variables aHeaders y aCols nao existen como private, por lo que la función gdFieldPos no se puede utilizar //Se extrae la variable aHeader del modelo SEL_DETAIL controla los registros de la pantalla de formas de pagos de la tabla SEL //Se construye la variable aCols y después se actualiza al modelo SEL_DETAIL para que aparezcan las formas de pago visualmente en pantalla Local aArea := getArea() Local oModelSEL := oModel:GetModel("SEL_DETAIL") Local aHeader := oModelSEL:aHeader Local aCols := {} Local nC := 1 Local nH := 1 Local nPosNro := aScan(aHeader,{|x| AllTrim(x[2])=="EL_NUMERO" }) //Inicializa la variable aCols con valores por defecto a partir del tamaño de aHeader addLine(aHeader, @aCols) If MsgYesNo("Deseja importar arquivo .csv ?", "Cheques") fLoadCsv(@aCols, aHeader) EndIf //Actualización al modelo SEL_DETAIL en grid for nC:= 1 to Len(aCols) If !Empty(oModelSEL:GetValue("EL_NUMERO")) // Se agrega una línea nueva al modelo en caso de que el exista el campo EL_NUMERO ya informado en la línea actual oModelSEL:AddLine() EndIf If !Empty(aCols[nC][nPosNro]) // Se verifica que el campo EL_NUMERO no este vacío para identificar que el registro de aCols es válido for nH := 1 to Len(aHeader) oModelSEL:loadValue(aHeader[nH][2],aCols[nC][nH]) // Se carga la información de aCols en el modelo SEL_DETAIL de la vista en grid Next nH If !oModelSEL:VldData() Help( ,,"Error de Modelo",,oModel:GetModel():GetErrorMessage()[6], 1, 0) // Mensaje de error en caso de que la línea del modelo no sea válida Exit EndIf EndIf Next nC restArea(aArea) RETURN **************************************************** Static Function fLoadCsv(aCols, aHeader) Local nLinha := 0 Local aDados := {} Local aColsV := ACLONE(aCols[1]) //Se obtiene la posición de cada campo de la tabla SEL para reemplazar el uso de gdFieldPos Local nPosNro := aScan(aHeader,{|x| AllTrim(x[2])=="EL_NUMERO" }) Local nPosBco := aScan(aHeader,{|x| AllTrim(x[2])=="EL_BCOCHQ" }) Local nPosAge := aScan(aHeader,{|x| AllTrim(x[2])=="EL_AGECHQ" }) Local nPosPos := aScan(aHeader,{|x| AllTrim(x[2])=="EL_POSTAL" }) Local nPosTipo := aScan(aHeader,{|x| AllTrim(x[2])=="EL_TIPO" }) Local nPosPref := aScan(aHeader,{|x| AllTrim(x[2])=="EL_PREFIXO" }) Local nPosValor := aScan(aHeader,{|x| AllTrim(x[2])=="EL_VALOR" }) Local nPosEmiss := aScan(aHeader,{|x| AllTrim(x[2])=="EL_EMISSAO" }) Local nPosVnto := aScan(aHeader,{|x| AllTrim(x[2])=="EL_DTVCTO" }) Local nPosBanc := aScan(aHeader,{|x| AllTrim(x[2])=="EL_BANCO" }) Local nPosAgen := aScan(aHeader,{|x| AllTrim(x[2])=="EL_AGENCIA" }) Local nPosCont := aScan(aHeader,{|x| AllTrim(x[2])=="EL_CONTA" }) Local nPosObs := aScan(aHeader,{|x| AllTrim(x[2])=="EL_OBSBCO" }) //Se lee el archivo .csv cFOpen := cGetFile("Arquivos |*.CSV",OemToAnsi("Selecione o arquivo para Importação: ")) If Len(cFOpen) > 0 .And. FILE(cFOpen) //Abre o arquivo selecionado nHandle := FT_FUse(cFOpen) If nHandle == -1 MsgAlert("Erro de abertura do arquivo ") Return EndIf nNumReg := FT_FLastRec() FT_FGoTop() FT_FSkip() While !FT_FEof() nLinha++ If nLinha+1 == nNumReg Exit Endif aDados := Separa(FT_FReadln(),';') cValor := StrTran(Substr(aDados[7],2),".","") cValor := StrTran(cValor,",",".") aBcoCh := fRetBcoCh(aDados[2]) If nLinha > 1 AADD(aCols,Aclone(aColsV)) EndIf aCols[nLinha][nPosTipo] := "CHD" aCols[nLinha][nPosNro] := padr(aDados[1],TamSx3("EL_NUMERO")[1]) aCols[nLinha][nPosValor] := Val(cValor) aCols[nLinha][nPosEmiss] := ctod(aDados[5]) aCols[nLinha][nPosVnto] := ctod(aDados[6]) aCols[nLinha][nPosBanc] := Padr("001",TamSx3("EL_BANCO")[1]) aCols[nLinha][nPosAgen] := Padr("00001",TamSx3("EL_AGENCIA")[1]) aCols[nLinha][nPosCont] := Padr("0000000001",TamSx3("EL_CONTA")[1]) aCols[nLinha][nPosBco] := Padr(aBcoCh[1],TamSx3("EL_BCOCHQ")[1]) aCols[nLinha][nPosPref] := Padr(aBcoCh[1],TamSx3("EL_PREFIXO")[1]) aCols[nLinha][nPosAge] := Padr(aBcoCh[2],TamSx3("EL_AGECHQ")[1]) aCols[nLinha][nPosPos] := Padr(aBcoCh[3],TamSx3("EL_POSTAL")[1]) aCols[nLinha][nPosObs] := aDados[2] FT_FSkip() EndDo FCLose(nHandle) EndIf Return ************************************ Static Function fRetBcoCh(pDescri) Local cQuery := "", aRet := {"","",""} cQuery := "SELECT FJN_COD, FJN_AGENCI, FJN_POSTAL, FJO_NOME " cQuery += "FROM "+RetSqlName("FJN")+" (NOLOCK) FJN JOIN "+RetSqlName("FJO")+" (NOLOCK) FJO ON FJN_FILIAL=FJO_FILIAL AND FJN_COD=FJO_COD " cQuery += "WHERE FJN.D_E_L_E_T_ = ' ' AND FJO.D_E_L_E_T_ = ' ' " cQuery += "AND FJO_NOME LIKE '%"+Alltrim(pDescri)+"%' " If Select("QRY") <> 0 QRY->(dbCloseArea()) End dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),"QRY",.T.,.T.) QRY->(dbGoTop()) If !QRY->(Eof()) aRet[1] := QRY->FJN_COD aRet[2] := QRY->FJN_AGENCI aRet[3] := QRY->FJN_POSTAL else aRet[1] := "005" aRet[2] := "00001" aRet[3] := "1000" EndIf QRY->(dbCloseArea()) Return(aRet) /*/{Protheus.doc} addLine Agrega una nueva línea a aCols en base a los campos en aHeader /*/ Static function addLine(aHeader, aCols) Local nX, nY Aadd(aCols, Array(Len(aHeader))) nX := Len(aCols) For nY := 1 to Len(aHeader) If !(aHeader[nY][2] $ "EL_BANCOS|EL_BCOCHQS") // EL_BANCOS y EL_BCOCHQS son campos virtuales de la forma de pago sin grid, estos se dejan como vacío aCols[nX][nY] := CriaVar(aHeader[nY][2]) Else aCols[nX][nY] := "" EndIf Next nY Return nX |