abreuluiston 7/11/2023, 18:45
Olá Diego, boa-tarde!
Isso pode ser feito de várias formas, com ctz se outra pessoa olhar as notas pode até ter outra lógica. O que eu acho é que você deveria normatizar suas tabelas e optar por um índice numérico e simples sem a necessidade de colocar data e hora e também usuário no índice.
A questão principal que eu comentei é que seu índice é um campo auto-numerado e, portanto, você não controla ele, mas sim o próprio Access. Se optar por manter esse índice criado na auto-numeração a primeira coisa a fazer é eliminar o outro código ou, se ele é um código importante para você optar por ele e retirar o campo de auto-numeração. Veja:
A) Se optar por permanecer e excluir o campo próprio de código os registros são inseridos na base e cada um ganhará um código definido pelo Access e, dessa forma, você não precisa se preocupar com essa chave primária.
B) Se optar por ter você o controle do código e a chave primária ser o seu campo ai sim é necessário controlar para saber qual a numeração que os registros devem receber ao serem exportados para a base online.
Nesse caso uma forma seria a seguinte: uma tabela simples de configuração do sistema que um dos campos seja o próximo código (veja, essa tabela possui apenas uma linha e nesse exemplo apenas um campo). Vou usar de exemplo um campo chamado proxCod. Então, o proxCod deverá sempre ser o próximo código válido para a entrada de um registro. Mas, importante, lembre-se que você trabalha num ambiente de rede e, portanto, um ou mais usuários podem estar exportando os registros ao mesmo tempo. Nesse caso um dos caminhos possíveis seria:
1) fazer uma consulta na base offline e obter o total de registros a serem exportados. Digamos que a resposta foi de 7 registros;
2) abrir um recordset (porém esse recordset deve ser do tipo que bloqueia a tabela enquanto está aberto) da tabela de configurações e pegar o valor presente para o proxCod e, imediatamente, somar os 7 +1 e o resultado gravar no campo proxCod e fechar o recordset. Isso garante que você já tenha pego a range de códigos que serão usados nessa instância e se outro usuário entrar no momento em que essa operação estiver acontecendo o Access retornará um erro que pode ser controlado. Assim a rotina pode insistir até que a tabela esteja liberada. Veja, esse procedimento é rápido, mas é necessário controlar pq é um ambiente de rede.
3) A partir desse momento você deveria gravar os dados utilizando um loop e utilizar os 7 códigos que estão na range conhecida.
Para se certificar que os registros foram inseridos a checagem poderia ser cruzando outras informações (outro campo ou um conjunto de campos que você sabe que dificilmente estariam cadastrados em outra máquina). Então, também a partir de loops você checaria a partir dos dados existentes na sua tabela se eles estão na base online e se estivessem bastaria eliminá-los da base offline.
Veja, como mencionei, é complicado eu desenvolver toda essa lógica pq dá um certo trabalho e eu teria que simular um ambiente de rede para checar se a rotina está fazendo corretamente a simultaneidade no momento da checagem e gravação do próximo novo código válido. Insisto, num ambiente de rede se não observar esse critério de controle em campos sensíveis como uma chave primária registros podem sim ser perdidos. A lógica é exatamente a que descrevi, mas, claro que a codificação exige um pouco de prática com lógica e com banco de dados.
O caminho "A" é bem mais simples e você deveria apenas se preocupar com a checagem/validação de que os registros foram todos exportados com sucesso. Porém, na minha opnião, não gosto de campos auto-numerados pq gosto de normalizar meu banco de dados relacionando tabelas e gosto mais de criar meus próprios índices. Mas isso não significa que não funcione no seu caso e derrepente sua base não é tão complexa a ponto de precisar de uma normalização de tabelas.
Se optar por ele (caminho A) ainda posso ajudar no sentido de equalizar erros da sua lógica de checagem ou em como fazer. Mas se optar pelo caminho B para te ajudar talvez fosse melhor uma parceria minha acessando diretamente também o seu ambiente de rede. Contudo fazer isso está mais para assessoria do que auxílio tirando suas dúvidas.
Espero que tenha entendido minha explicação de todos os pontos e do meu argumento final.
At.
Luis Abreu