Zerar Tabela de Vendas

Quando começamos a testar o Magento é muito comum a realização de diversos pedidos, cadastros, consultas, etc. Acontece que toda essa informação vai sendo registrada pelo sistema.

E quando queremos fazer os testes finais, ou até mesmo liberar o sistema para uso, temos um monte de lixo no banco de dados. E seria interessante se pudéssemos zerar o banco e ter um novo começo. “like a virgin” – madonna

Para nossa alegria é possível rodar um script SQL no banco de dados e obter exatamente este resultado, como veremos abaixo.

Preparando o sql

Essa etapa talvez seja mais importante do que a execução do próprio script. Pois a cada versão do Magento tabelas são criadas e/ou modificadas, e isso gera uma incompatibilidade entre as versões, consequentemente entre os scripts.

Isso significa que cada versão do Magento possui um script diferente para limpar as tabelas de vendas. Mas não se preocupe, eu tenho a solução! Um gerador automático de script para limpar suas tabelas, limpa até mesmo as sujeiras mais… brincadeiras à parte, copie e execute o código abaixo:

/*prepara o comando para deletar todas as tabelas de vendas*/
SELECT DISTINCT concat("TRUNCATE TABLE `", TABLE_NAME, "`;") 
    FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'sales_%'
    AND TABLE_NAME NOT IN ('sales_order_status','sales_order_status_state')
    AND TABLE_SCHEMA='nome_do_seu_database';

A única informação que você precisa alterar antes de executar este script, é o nome_do_seu_database. Que você deve alterar para o database onde seu Magento foi instalado.

Esse script não vai realizar nenhuma alteração nas suas tabelas, ele apenas vai gerar o script SQL dinâmicamente, que você deve copiar e executar em seguida.

Truncate esmaga

Se você entende alguma coisa de SQL, a resposta pra sua pergunta provavelmente é sim. Sim, poderíamos usar o comando DELETE.

Basicamente o DELETE aceita cláusula WHERE, e o TRUNCATE não. Isso torna o comando TRUNCATE mais rápido – existem outras diferenças na forma como eles limpam os dados, mas não vou entrar em detalhes.

Após gerar seu script dinâmicamente, você vai obter um resultado semelhante a este (exemplo usando a versão 1.7.0.2 do Magento CE):

TRUNCATE TABLE `sales_bestsellers_aggregated_daily`;
TRUNCATE TABLE `sales_bestsellers_aggregated_monthly`;
TRUNCATE TABLE `sales_bestsellers_aggregated_yearly`;
TRUNCATE TABLE `sales_billing_agreement`;
TRUNCATE TABLE `sales_billing_agreement_order`;
TRUNCATE TABLE `sales_flat_creditmemo`;
TRUNCATE TABLE `sales_flat_creditmemo_comment`;
TRUNCATE TABLE `sales_flat_creditmemo_grid`;
TRUNCATE TABLE `sales_flat_creditmemo_item`;
TRUNCATE TABLE `sales_flat_invoice`;
TRUNCATE TABLE `sales_flat_invoice_comment`;
TRUNCATE TABLE `sales_flat_invoice_grid`;
TRUNCATE TABLE `sales_flat_invoice_item`;
TRUNCATE TABLE `sales_flat_order`;
TRUNCATE TABLE `sales_flat_order_address`;
TRUNCATE TABLE `sales_flat_order_grid`;
TRUNCATE TABLE `sales_flat_order_item`;
TRUNCATE TABLE `sales_flat_order_payment`;
TRUNCATE TABLE `sales_flat_order_status_history`;
TRUNCATE TABLE `sales_flat_quote`;
TRUNCATE TABLE `sales_flat_quote_address`;
TRUNCATE TABLE `sales_flat_quote_address_item`;
TRUNCATE TABLE `sales_flat_quote_item`;
TRUNCATE TABLE `sales_flat_quote_item_option`;
TRUNCATE TABLE `sales_flat_quote_payment`;
TRUNCATE TABLE `sales_flat_quote_shipping_rate`;
TRUNCATE TABLE `sales_flat_shipment`;
TRUNCATE TABLE `sales_flat_shipment_comment`;
TRUNCATE TABLE `sales_flat_shipment_grid`;
TRUNCATE TABLE `sales_flat_shipment_item`;
TRUNCATE TABLE `sales_flat_shipment_track`;
TRUNCATE TABLE `sales_invoiced_aggregated`;
TRUNCATE TABLE `sales_invoiced_aggregated_order`;
TRUNCATE TABLE `sales_order_aggregated_created`;
TRUNCATE TABLE `sales_order_aggregated_updated`;
TRUNCATE TABLE `sales_order_status_label`;
TRUNCATE TABLE `sales_order_tax`;
TRUNCATE TABLE `sales_order_tax_item`;
TRUNCATE TABLE `sales_payment_transaction`;
TRUNCATE TABLE `sales_recurring_profile`;
TRUNCATE TABLE `sales_recurring_profile_order`;
TRUNCATE TABLE `sales_refunded_aggregated`;
TRUNCATE TABLE `sales_refunded_aggregated_order`;
TRUNCATE TABLE `sales_shipping_aggregated`;
TRUNCATE TABLE `sales_shipping_aggregated_order`;
TRUNCATE TABLE `salesrule`;
TRUNCATE TABLE `salesrule_coupon`;
TRUNCATE TABLE `salesrule_coupon_usage`;
TRUNCATE TABLE `salesrule_customer`;
TRUNCATE TABLE `salesrule_customer_group`;
TRUNCATE TABLE `salesrule_label`;
TRUNCATE TABLE `salesrule_product_attribute`;
TRUNCATE TABLE `salesrule_website`;

Agora sim, com este script em mãos você executa e limpa as tabelas de vendas. Porém, eu sugiro que você leia este post até o final antes de clicar em qualquer botão executar.

Preparando mais sql

As tabelas do Magento, assim como a grande maioria das tabelas de outros sistemas, possuem uma chave de auto-incremento, o famoso campo ID das tabelas.

Após zerar as tabelas, queremos garantir que estes campos voltem no tempo e reiniciem suas contagens a partir do ID=1, certo!? Então vamos executar outro gerador de scripts mágico:

/*prepara o comando para reiniciar id das tabelas de vendas*/
SELECT DISTINCT concat("ALTER TABLE `", TABLE_NAME, "` AUTO_INCREMENT=1", ";") 
    FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'sales_%'
    AND TABLE_NAME NOT IN ('sales_order_status','sales_order_status_state')
    AND TABLE_SCHEMA='nome_do_seu_database';

Este código funciona da mesma forma que o anterior, você precisa alterar o valor nome_do_seu_database para o nome do banco de dados onde seu Magento está instalado.

Esse script também não vai realizar nenhuma alteração nas suas tabelas, ele apenas vai gerar o script SQL dinâmicamente, que você deve copiar e executar em seguida.

Alter table finaliza

Ao rodar o comando ALTER TABLE então você finaliza os trabalhos. Esse é o script responsável por reiniciar a contagem das colunas ID’s das tabelas.

Esse script NUNCA deve ser executado antes do truncate.

Após gerar seu script dinâmicamente, você vai obter um resultado semelhante a este (exemplo usando a versão 1.7.0.2 do Magento CE):

ALTER TABLE `sales_bestsellers_aggregated_daily` AUTO_INCREMENT=1;
ALTER TABLE `sales_bestsellers_aggregated_monthly` AUTO_INCREMENT=1;
ALTER TABLE `sales_bestsellers_aggregated_yearly` AUTO_INCREMENT=1;
ALTER TABLE `sales_billing_agreement` AUTO_INCREMENT=1;
ALTER TABLE `sales_billing_agreement_order` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_creditmemo` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_creditmemo_comment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_creditmemo_grid` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_creditmemo_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_invoice` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_invoice_comment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_invoice_grid` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_invoice_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_address` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_grid` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_payment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_status_history` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_address` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_address_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_item_option` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_payment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_shipping_rate` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment_comment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment_grid` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment_track` AUTO_INCREMENT=1;
ALTER TABLE `sales_invoiced_aggregated` AUTO_INCREMENT=1;
ALTER TABLE `sales_invoiced_aggregated_order` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_aggregated_created` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_aggregated_updated` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_status_label` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_tax` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_tax_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_payment_transaction` AUTO_INCREMENT=1;
ALTER TABLE `sales_recurring_profile` AUTO_INCREMENT=1;
ALTER TABLE `sales_recurring_profile_order` AUTO_INCREMENT=1;
ALTER TABLE `sales_refunded_aggregated` AUTO_INCREMENT=1;
ALTER TABLE `sales_refunded_aggregated_order` AUTO_INCREMENT=1;
ALTER TABLE `sales_shipping_aggregated` AUTO_INCREMENT=1;
ALTER TABLE `sales_shipping_aggregated_order` AUTO_INCREMENT=1;
ALTER TABLE `salesrule` AUTO_INCREMENT=1;
ALTER TABLE `salesrule_coupon` AUTO_INCREMENT=1;
ALTER TABLE `salesrule_coupon_usage` AUTO_INCREMENT=1;
ALTER TABLE `salesrule_customer` AUTO_INCREMENT=1;
ALTER TABLE `salesrule_customer_group` AUTO_INCREMENT=1;
ALTER TABLE `salesrule_label` AUTO_INCREMENT=1;
ALTER TABLE `salesrule_product_attribute` AUTO_INCREMENT=1;
ALTER TABLE `salesrule_website` AUTO_INCREMENT=1;

Agora basta você executar o script acima, mas antes disso – continue lendo o post.

Dica extra

Muita gente pode estar pensando “Mas onde eu executo isso?“. Ora bolas, no seu SGBD.

Eu gosto de usar o Sequel Pro (em um MacOsX), mas você pode usar o famoso phpMyAdmin.

truncate nas tabelas

Basta copiar o código aqui do blog, colar no campo query/sql, e executar.

Mas eu recomendo que antes de executar o script gerado automaticamente, você adicione no início e ao final dele os seguintes comandos:

SET FOREIGN_KEY_CHECKS=0;
    /*aquele codigo gerado automaticamente pelo script*/
SET FOREIGN_KEY_CHECKS=1;

Isso vai evitar qualquer erro que possa ocorrer com chave-estrangeira na hora que você tentar excluir os dados das tabelas de vendas.

Você pode usar o código pronto deste exemplo, sem precisar usar o gerador de script’s – desde que sua versão do Magento CE seja a 1.7.0.2.

Sucesso!