AM
Erro ao salvar edição de dados
Boa tarde.
Ao salvar a edição de um registro, dispara erro do MySQL de UNIQUE em um campo. Realmente, este campo deve manter seus valores únicos, embora ele não seja a chave da tabela. A questão é que estou editando um registro já existente, e não alterei o valor do campo em questão. Fica parecendo que o botão Editar, na datagrid de consulta, dispara ação de INSERT ao invés de UPDATE.
Segue anexo. Desde já agradeço qualquer ajuda.
Ao salvar a edição de um registro, dispara erro do MySQL de UNIQUE em um campo. Realmente, este campo deve manter seus valores únicos, embora ele não seja a chave da tabela. A questão é que estou editando um registro já existente, e não alterei o valor do campo em questão. Fica parecendo que o botão Editar, na datagrid de consulta, dispara ação de INSERT ao invés de UPDATE.
Segue anexo. Desde já agradeço qualquer ajuda.
André
Verifica o onSave está editando ou inserindo.
O erro deveria ocorrer na "inserção" do registro, pois não pode haver 2 registros iguais.
Posta o código, assim será mais fácil da galera poder ajudar.
A linha que cria o botão Edit na DataGrid de Consulta é esta:
$this->form->addActionLink(_t('New'), new TAction(['ClienteForm', 'onEdit']), 'fa:plus green');
Usei wizard do Adianti Studio para construir.
Minto: é esta aqui $this->datagrid->addAction($action1, _t('Edit'), 'far:edit blue');
Vamos organizar a coisa (hehehe).
Classe de consulta:
$action1 = new TDataGridAction(['ClienteForm', 'onEdit'], ['ID_CLIENTE'=>'{ID_CLIENTE}']);
$action2 = new TDataGridAction([$this, 'onDelete'], ['ID_CLIENTE'=>'{ID_CLIENTE}']);
$this->datagrid->addAction($action1, _t('Edit'), 'far:edit blue');
$this->datagrid->addAction($action2 ,_t('Delete'), 'far:trash-alt red');
...
public function onInlineEdit($param)
{
try
{
// get the parameter $key
$field = $param['field'];
$key = $param['key'];
$value = $param['value'];
TTransaction::open('sc3'); // open a transaction with database
$object = new Cliente($key); // instantiates the Active Record
$object->{$field} = $value;
$object->store(); // update the object in the database
TTransaction::close(); // close the transaction
$this->onReload($param); // reload the listing
new TMessage('info', "Record Updated");
}
catch (Exception $e) // in case of exception
{
new TMessage('error', $e->getMessage()); // shows the exception error message
TTransaction::rollback(); // undo all pending operations
}
}
Classe de Inserção/Edição:
public function onSave( $param )
{
$caracter_nao_numerico = array(".", "_", "/", "(", ")", "-");
try
{
TTransaction::open('sc3'); // open a transaction
/**
// Enable Debug logger for SQL operations inside the transaction
TTransaction::setLogger(new TLoggerSTD); // standard output
TTransaction::setLogger(new TLoggerTXT('log.txt')); // file
**/
$this->form->validate(); // validate form data
$data = $this->form->getData(); // get form data as array
$object = new Cliente; // create an empty object
$object->fromArray( (array) $data); // load the object with data
// Campos com máscara necessitam retirar formatação para gravar devido ao tamanho dos campos em Banco de Dados.
$object->CEP = str_replace($caracter_nao_numerico, '', $object->CEP);
$object->CNPJ = str_replace($caracter_nao_numerico, '', $object->CNPJ);
$object->CPF = str_replace($caracter_nao_numerico, '', $object->CPF);
$object->FONE = str_replace($caracter_nao_numerico, '', $object->FONE);
$object->CONTADOR_CPF = str_replace($caracter_nao_numerico, '', $object->CONTADOR_CPF);
$object->RESPONSAVEL_CPF = str_replace($caracter_nao_numerico, '', $object->RESPONSAVEL_CPF);
$object->CONTADOR_CPF = str_replace($caracter_nao_numerico, '', $object->CONTADOR_CPF);
$object->store(); // save the object
// get the generated ID_CLIENTE
$data->ID_CLIENTE = $object->ID_CLIENTE;
$this->form->setData($data); // fill form data
TTransaction::close(); // close the transaction
new TMessage('info', AdiantiCoreTranslator::translate('Record saved'));
}
catch (Exception $e) // in case of exception
{
new TMessage('error', $e->getMessage()); // shows the exception error message
$this->form->setData( $this->form->getData() ); // keep form data
TTransaction::rollback(); // undo all pending operations
}
}
Faz a seguinte, no onSave, depois de $data = $this->form->getData();
coloque o var_dump($data) e veja se o $ID_CLIENTE está preenchido!
Se está editando, deve ser diferente de null ou 0.
Obrigado, Marcelo! Com o dump da variável, vi meu erro: retirei o ID como campo do formulário, porque não vejo necessidade do usuário final ter essa info, e aí deu-se todo o problema. Embora continue com essa opinião: PK não precisa estar em tel.
Coloque como THidden