Hola Claudio,Claudio Ricardo wrote: ↑Wed Feb 17, 2021 5:26 pm Comienza en la primer "linea" del array 1 y busca coincidencias dentro del array 2, si no encuentra continúa con la siguiente.
Para aumentar la coincidencia podrias reemplazar: cDesc := aArray1 [i,2] por cDesc := Upper (aArray [i,2]) y
If aArray2 [j,2] $ cDesc por If Upper (aArray2 [j,2]) $ cDesc
Avancé un poco más tomando tu código y tu idea, intenté hacer otra implementación basándome en ésta función:
viewtopic.php?f=5&t=6604&p=63487&hilit= ... ING#p63487
con la idea de dividir en trozos la descripción del movimiento del banco e ir comparando contra la descripción del segundo array de los movimientos auxiliares, al parecer el código funciona, pero el detalle es que de 1000 movimientos (el archivo Excel del banco tiene 1000 filas y el archivo Excel de los movimientos auxiliar de contabilidad tiene 1000 filas), sólo está encontrando muy pocas coincidencias poco más de 20 y pues eso no es algo muy útil.
Aquí el código:
Code: Select all
/*
main
*/
FUNCTION main()
LOCAL cDesc, dDate, nCargo, nAbono
LOCAL aArray1 := { }
LOCAL aArray2 := { }
LOCAL i, j, x
LOCAL cArchivo := hb_dirBase() + 'resultado.log'
LOCAL lNuevo
IF File(cArchivo)
hb_vfErase(cArchivo)
ENDIF
aArray1 := DatosBanco()
aArray2 := DatosAux()
FOR i := 1 TO Len(aArray1)
dDate := aArray1 [i,1]
cDesc := aArray1 [i,2] // descripción del banco
nCargo := aArray1 [i,3]
nAbono := aArray1 [i,4]
aRet := SplitString(cDesc , 30, ' ')
FOR j := 1 TO Len(aRet)
//crearArchivo( cArchivo, hb_NToS(j) + Space(3) + 'texto a comparar --> ' + aRet[j] + hb_eol(), @lNuevo )
FOR x: = 1 TO Len(aArray2) // arreglo datos auxiliar
IF aArray2 [x,3] == nCargo .AND. aArray2 [x,4] == nAbono
IF aRet[j] $ aArray2 [x,2]
//crearArchivo( cArchivo, 'texto a comparar --> ' + aRet[j] + ;
// ' contra --> ' + aArray2 [x,2] + hb_eol(), @lNuevo )
// test
// auxiliar
? 'fila ' + hb_NToS(x) + ' del Auxiliar --> ' + aArray2 [x,2] + ;
' Cargo --> ' + hb_NToS(aArray2 [x,3]) + ;
' Abono --> ' + hb_NToS(aArray2 [x,4])
// banco
? 'fila ' + hb_NToS(i) + ' del Banco --> ' + cDesc + ;
' Cargo --> ' + hb_NToS(nCargo) + ;
' Abono --> ' + hb_NToS(nAbono)
CrearArchivo( cArchivo, 'fila ' + hb_NToS(x) + ' del Auxiliar --> ' + aArray2 [x,2] + ;
' Cargo --> ' + hb_NToS(aArray2 [x,3]) + ;
' Abono --> ' + hb_NToS(aArray2 [x,4]) + hb_eol(), @lNuevo )
CrearArchivo( cArchivo, 'fila ' + hb_NToS(i) + ' del Banco --> ' + cDesc + ;
' Cargo --> ' + hb_NToS(nCargo) + ;
' Abono --> ' + hb_NToS(nAbono) + hb_eol(), @lNuevo )
// test
ENDIF
ENDIF
NEXT x
NEXT j
NEXT i
? 'Terminado...'
RETURN NIL
/*********/
/*
SplitString
*/
FUNCTION SplitString(cString, nLen, cSplitChar)
LOCAL aOrphans := { "the", "a", "an" }
LOCAL aSplitString := {}
LOCAL cSplitString := ""
LOCAL aTokens, i, cLastWord
hb_default(@cString, '' )
hb_default(@nLen, 1 )
hb_default(@cSplitChar, ' ')
aTokens := hb_ATokens( cString, cSplitChar )
FOR i := 1 TO Len( aTokens )
IF Len ( cSplitString ) + Len ( aTokens [i] ) <= nLen
cSplitString += aTokens [i] + IF ( Len ( cSplitString ) + Len ( aTokens [i] ) < nLen .AND. i < Len( aTokens ) , cSplitChar, "")
ELSE
cSplitString := AllTrim ( cSplitString )
/* don't leave "orphans" (ex. English article) at the end of the string */
cLastWord := StrTran ( SubStr( cSplitString, RAt ( " ", cSplitString ) + 1), cSplitChar, "")
IF AScan ( aOrphans, { |x| Upper(x) == Upper( cLastWord ) } ) > 0
cSplitString := Left ( cSplitString, Len ( cSplitString ) - Len ( cLastWord ) )
AADD ( aSplitString, AllTrim ( cSplitString ) )
cSplitString := cLastWord + cSplitChar + aTokens [i] + IF ( i < Len( aTokens ) , cSplitChar, "")
ELSE
AADD ( aSplitString, AllTrim ( cSplitString ) )
cSplitString := aTokens [i] + IF ( i < Len( aTokens ) , cSplitChar, "")
ENDIF
ENDIF
NEXT i
AADD ( aSplitString, Alltrim (cSplitString ) )
RETURN aSplitString
/*********/
/*
* DatosAux
*/
FUNCTION DatosAux()
LOCAL oError
LOCAL oExcel
LOCAL oWorkBook, oHoja, nFilas
LOCAL i
LOCAL fecha, descripcion, cargo, abono
LOCAL aMovtos := { }
IF( oExcel := win_oleCreateObject( "Excel.Application" ) ) == NIL
? 'Error: Microsoft Excel no está disponible, ', win_OleErrorText()
RETURN NIL
ENDIF
oExcel:Visible := .f.
oExcel:DisplayAlerts := .f.
oWorkBook := oExcel:WorkBooks:Open( "C:\EdoCuentaBanco\hmg\auxiliar.xlsx" )
oExcel:Sheets(1):Select()
oHoja := oExcel:ActiveSheet
nFilas := oHoja:UsedRange:Rows:Count()
FOR i := 2 TO nFilas
fecha := Cell2Chr( oHoja:cells(i,1):value )
descripcion := Cell2Chr( oHoja:cells(i,4):value )
cargo := Cell2Val( oHoja:cells(i,6):value )
abono := Cell2Val( oHoja:cells(i,7):value )
AAdd( aMovtos, { fecha, Alltrim(descripcion), cargo, abono } )
NEXT
oWorkBook:Close()
oExcel:Quit()
oHoja := NIL
oWorkBook := NIL
oExcel := NIL
/*
RELEASE oHoja
RELEASE oWorkBook
RELEASE oExcel
*/
RETURN (aMovtos)
/*********/
/*
* DatosBanco
*/
FUNCTION DatosBanco()
LOCAL oError
LOCAL oExcel
LOCAL oWorkBook, oHoja, nFilas
LOCAL i
LOCAL fecha, descripcion, cargo, abono
LOCAL aMovtos := { }
IF( oExcel := win_oleCreateObject( "Excel.Application" ) ) == nil
? 'Error: Microsoft Excel no está disponible, ', win_OleErrorText()
RETURN NIL
ENDIF
oExcel:Visible := .f.
oExcel:DisplayAlerts := .f.
oWorkBook := oExcel:WorkBooks:Open( "C:\EdoCuentaBanco\hmg\banco.xlsx" )
oExcel:Sheets(1):Select()
oHoja := oExcel:ActiveSheet
nFilas := oHoja:UsedRange:Rows:Count()
FOR i := 2 TO nFilas
fecha := Cell2Chr( oHoja:cells(i,1):value )
descripcion := Cell2Chr( oHoja:cells(i,2):value )
cargo := Cell2Val( oHoja:cells(i,3):value )
abono := Cell2Val( oHoja:cells(i,4):value )
AAdd( aMovtos, { fecha, Alltrim(descripcion), cargo, abono } )
NEXT
oWorkBook:Close()
oExcel:Quit()
oHoja := NIL
oWorkBook := NIL
oExcel := NIL
/*
RELEASE oHoja
RELEASE oWorkBook
RELEASE oExcel
*/
RETURN (aMovtos)
/*********/
Gracias.
Saludos,
Javier