Agora alterações delicadas.... nome de arquivo e nome de campo CHAVE.
Tive até que mexer nas atualizações anteriores.
O arquivo de pedidos, passa a ser JPPEDIDO ao invés de JPPEDI.
E o campo chave passa a ser IdPedido, ao invés de PdPedido.
STATIC FUNCTION JPPEDIDOCreateDbf()
LOCAL nCont, cCampo
LOCAL aStruList := { ;
{ "IDPEDIDO", "C", 6 }, ;
...
{ "PDINFALT", "C", 80 } }
IF AppVersaoDbfAnt() < 99999999
AAdd( aStruList, { "PDPEDIDO", "C", 6 } )
ENDIF
SayScroll( "JPPEDIDO, verificando atualizações" )
IF ! ValidaStru( "JPPEDIDO", aStruList )
MsgStop( "JPPEDIDO não disponÃvel!" )
QUIT
ENDIF
Acima: Notem que o campo pdPedido vai existir até determinada versão... ainda em testes, deixei como eterna 99/99/9999
IF ! File( "jppedi.dbf" )
RETURN NIL
ENDIF
IF ! ValidaStru( "JPPEDI", aStruList )
MsgStop( "JPPEDI não dispnÃvel!" )
QUIT
ENDIF
Acima: Como vou importar o arquivo antigo, com certeza preciso garantir que a estrutura está atualizada.
IF ! UseSoDbf( "jppedi", .T. )
QUIT
ENDIF
IF ! AbreArquivos( "jppedido" )
QUIT
ENDIF
SELECT jppedi
GOTO TOP
DO WHILE ! Eof()
SELECT jppedido
IF Empty( jppedi->idPedido )
SEEK jppedi->pdPedido
ELSE
SEEK jppedi->idPedido
ENDIF
IF Eof()
RecAppend()
REPLACE ;
jppedido->pdPedido WITH iif( Empty( jppedi->idPedido ), jppedi->pdPedido, jppedi->idPedido ), ;
jppedido->idPedido WITH jppedi->idPedido
ENDIF
RecLock()
FOR nCont = 1 TO FCount()
cCampo := FieldName( nCont )
FieldPut( nCont, jppedi->( FieldGet( FieldNum( cCampo ) ) ) )
NEXT
RecUnlock()
SELECT jppedi
RecLock()
DELETE
RecUnlock()
SKIP
ENDDO
CLOSE DATABASES
fErase( "jppedi.dbf" )
RETURN NIL
Acima:
Detalhe 1:
IF Empty( jppedi->idPedido )
SEEK jppedi->pdPedido
ELSE
SEEK jppedi->idPedido
ENDIF
Porque isso?
Vai que algum cliente já rodou a atualização que gravou idPedido.... pra garantir se tiver conteúdo pego idPedido.
Ou seja... se a atualização já foi feita, não faz de novo, ou não corre o risco de gravar um número em branco no lugar dele.
Detalhe 2:
RecLock()
FOR nCont = 1 TO FCount()
cCampo := FieldName( nCont )
FieldPut( nCont, jppedi->( FieldGet( FieldNum( cCampo ) ) ) )
NEXT
RecUnlock()
Se os arquivos são iguais, porque preciso do FieldNum() ?
Minha atualização de estrutura NÃO mexe com ordem de campos.
Isso significa que os arquivos podem conter os mesmos campos, mas podem estar em outra ordem.
Bom a parte acima conclui a atualização de estrutura, de trocar o nome do arquivo, de importar o arquivo anterior.
Mesma coisa, precaução: vai incluindo e apagando. Se por algum motivo não conseguir excluir, na próxima vez não vai importar duplicado. (apesar que o SEEK resolve isso).