Lançado Adianti Framework 7.6!
Clique aqui para saber mais
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 UPDA...
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.

Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


Dominando o Adianti 7 Quero me inscrever agora!

Comentários (7)


MG

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.
AM

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.
AM

Minto: é esta aqui $this->datagrid->addAction($action1, _t('Edit'), 'far:edit blue');
AM

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

}

}



MG

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.
AM

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.
MG

Coloque como THidden