Cuando hay un documento/factura con muchas lineas, y el cliente se "olvida" de escribir una linea en determinado lugar, luego quiere la posibilidad de insertar una linea a la mitad del documento, lo que hice fue dar la posibilidad de cambiar las lineas que estan en el documento hacia arriba y hacia abajo y que el puntero del browse se quede en el mismo lugar, seguramente existe una manera mejor, yo lo hice asi, supongo que alguien lo podrá "normalizar", espero que a alguien le sirva.
(Considerando que no tengo numeradas las lineas de la factura, sino, sería todo mas facil, bastaría un indice y cambiar los numeros de linea y listo el pollo como dijo alguien...)
- Code: Select all Expand view RUN
***************
STATIC FUNCTION SpostaRiga( nOp, oLbxMov )
***************
LOCAL nRec := tmpcor->( recno() ), I, XX
LOCAL aTmpCor := {}, aTmpCor2 := {}
LOCAL nAt
IF nOp = 1 // SU
IF nRec = 1
MsgBeep()
oLbxMov:setFocus()
RETURN NIL
ENDIF
ELSEIF nOp = 2 // GIU
IF nRec = tmpcor->( RECCOUNT() )
MsgBeep()
oLbxMov:setFocus()
RETURN NIL
ENDIF
ENDIF
CursorWait()
nAt := oLbxMov:nRowPos
// CARICO TUTTI I DATI IN UN ARRAY
tmpcor->( DBEVAL( {|| tmpcor->( aTuttoIlRecord( @aTmpCor ) ) } ) )
// cancello dati
tmpcor->( FLOCK() )
tmpcor->( dbZap() )
// ordino i dati
IF nOp = 1 // SU
FOR i := 1 TO nRec - 2 // dove si trova la riga da spostare
AADD( aTmpcor2, aTmpCor[i] )
NEXT
AADD( aTmpCor2, aTmpCor[nRec] )
AADD( aTmpCor2, aTmpCor[nRec-1] )
FOR i := nRec + 1 TO LEN( aTmpCor )
AADD( aTmpcor2, aTmpCor[i] )
NEXT
ELSEIF nOp = 2 // GIU
FOR i := 1 TO nRec - 1 // dove si trova la riga da spostare
AADD( aTmpcor2, aTmpCor[i] )
NEXT
AADD( aTmpCor2, aTmpCor[nRec+1] )
AADD( aTmpCor2, aTmpCor[nRec] )
FOR i := nRec + 2 TO LEN( aTmpCor )
AADD( aTmpcor2, aTmpCor[i] )
NEXT
ENDIF
// inserisco dati
FOR i := 1 TO LEN( aTmpCor2 )
tmpcor->( add_rec() )
FOR xx=1 TO LEN( aTmpCor2[i] )
tmpcor->( fieldput( xx, aTmpcor2[i,xx] ) )
NEXT
NEXT
tmpcor->( dbUnLock() )
tmpcor->( dbGoTo( nRec + IIF( nOp=1, -1, 1 ) ) )
IF nOp = 1
IF nRec <= nAt
oLbxMov:GoUp()
ENDIF
IF nRec = 2
oLbxMov:BugUp()
ENDIF
ELSEIF nOp = 2
IF nRec <= nAt
//oLbxMov:GoDown()
ENDIF
ENDIF
oLbxMov:setFocus()
oLbxMov:refresh(.T.)
CursorArrow()
RETURN NIL
*
** eof SpostaRiga
***************
STATIC FUNCTION aTuttoIlRecord( aTmpCor )
***************
LOCAL aRecord := {}, I
LOCAL cAlias := ALIAS( SELECT() )
LOCAL nRC
nRc := (cAlias)->( FCOUNT() )
FOR i := 1 TO nRC
AADD( aRecord, (cAlias)->( fieldGet(i) ) )
NEXT
AADD( aTmpCor, aRecord )
RETURN aRecord
*
** eof aTuttoIlRecord
Saludos