31 Mar 2011
Posted by: Ricardo Pichler in: X++
Caros,
Uma vez eu precisei ‘limpar’ um BD de produção, foi quando o Fraga ainda estava ajudando a Microsoft no suporte via PrimeIT (já faz tempo!). O fato aconteceu porque os consultores tinham criado muitas empresas de teste na base de produção (pela facilidade de só trocar de empresa ao invés de abrir outra instância) e com isso trouxeram um prejuízo enorme quando fomos migrar de um release para outro, a ponto de termos que debugar processo de upgrade, até então, desconhecido para o suporte da MS Brasil! Acredito eu, que os consultores fazem isto por falta de informação, por não saberem como é o processo de upgrade, onde existem scripts de pré e pós sincronização que executam rotinas em muitas tabelas, uma vez para cada DataAreaId encontrado.
A solução que encontrei na época (e lembrei dela agora porque vi em outro artigo) foi vasculhar tabela por tabela procurando pelos DataAreaIDs que eu gostaria de apagar, o que resultou no sequinte script:
--Declarando as variáveis que irei usar DECLARE @TABLE VARCHAR(100) DECLARE @STATEMENT VARCHAR(500) DECLARE LOCALTABLE CURSOR FOR SELECT NAME FROM SYS.TABLES DECLARE @MYDATABASE VARCHAR(100) DECLARE @MYCOMPANIES VARCHAR(100) --Especificando a Base de Dados SELECT @MYDATABASE = 'DAX_HOM' --Especificando os DataAreaIds que eu quero apagar SELECT @MYCOMPANIES = '(''VC1'', ''VC2'', ''VC3'')' --Abrindo o Cursor OPEN LOCALTABLE --Carregando o Cursor pela Primeira vez FETCH NEXT FROM LOCALTABLE INTO @TABLE WHILE @@FETCH_STATUS = 0 BEGIN BEGIN TRY SET @STATEMENT = N'DELETE FROM [' + @MYDATABASE + '].[DBO].[' + @TABLE + '] WHERE [DATAAREAID] IN ' + @MYCOMPANIES PRINT @STATEMENT EXECUTE SP_EXECUTESQL @STATEMENT END TRY BEGIN CATCH PRINT 'DataAreaID não encontrado na Tablea: ' + @TABLE END CATCH FETCH NEXT FROM LOCALTABLE INTO @TABLE END CLOSE LOCALTABLE DEALLOCATE LOCALTABLE |
Usei um cursor para navegar em todas as tabelas e, a partir daí, removo o que tiver o DataAreaId que quero, nas tabelas onde não há DataAreaId é gerada uma excessão que é tratada no CATCH e com isso a rotina faz a limpeza geral.
Nem preciso dizer o cuidado que deve ser tomado antes de rodar este comando né!?
[]s
Pichler
Vi uma postagem bem legal no Ramon Morini’s Blog e recomendo a leitura, bem útil.
Usando as Funções Pick da Global
[]s
Pichler
Pessoal,
Achei que já tinha isso por aqui, mas fui precisar agora e não encontrei, então vou postar.
Algumas vezes quando estamos debugando, por algum motivo não completamos a seqüencia dos TTS e deixamos mais ttsbegins do que deveria, ai o AX começa a te dar mensagens dizendo que encontrou um par desbalanceado de TTSBEGIN/TTSCOMMIT e para resolver basta criar um job com um ttsabort, ou algo mais elaborado como:
1 2 3 4 5 | static void job1(Args _args) { while (appl.ttsLevel() > 0) ttsAbort; } |
[]s
Pichler
What you will learn from this book :
[]s
Pichler
08 Mar 2011
Posted by: Ricardo Pichler in: X++
Caros,
Existem algumas funcionalidades/propriedades que são pouco comentadas, no entanto, ao meu ver são muito úteis, principalmente quando o assunto é organização, palavra essa que falta muito no mercado brasileiro de AX, ok, talvez não só no ax! kkkk
Hoje vou falar da propriedade TableGroup que esta disponível em qualquer tabela e serve para classificar o tipo dela, qual a finalidade final e etc…
Para que serve? Vamos supor que você quer limpar todas as tabelas que contém transações da sua base de dados? Como faria? Essa é uma boa situação, se tiver todas as tabelas categorizadas, você resolve este problema rápido. Uma outra situação é a que você deseja exportar todos os dados que não sejam transações, você também conseguirá se tiver categorizado as tabelas.
Abaixo uma tabela relacionando o tipo de tabela, caracteristicas e exemplos: (retirado do msdn)
TableGroup | Características | Exemplos |
Parameter |
Contém dados usados como parâmetros ou informação para configurar tabelas principais (uma tabela que tem o TableGroup do tipo Main). Este tipo de tabela geralmente contém apenas um registro por empresa (DataAreaId). |
CustParameters, VendParameters |
Group |
Contém dados usados para categorizar os registros das tabelas principais (uma tabela que tem o TableGroup do tipo Main). Existe um relacionamento um para muitos entre tabelas do grupo Group e Main. |
CustGroup, VendGroup |
Main |
Contém os principais dados usados na aplicação. Existe um relacionamento um para muitos entre tabelas do grupo Main e Transaction. |
CustTable, VendTable |
Transaction |
Contém dados transacionais. Geralmente estas tabelas não são populadas diretamente. |
CustTrans, VendTrans |
WorkSheetHeader |
Categorizam as informações nas tabelas do grupo WorkSheetLine. O relacionamento é de um pra muitos entre WorkSheetHeader e WorkSheetLine. |
SalesTable, PurchTable |
WorksheetLine |
Contém informações para serem validadas e inseridas dentro de transações. Em comparação com os dados das tabelas transacionais a diferença é que os dados das tabelas WorkSheetLines são temporários e podem ser removidos / alterados sem afetar as transações que já foram geradas.. |
SalesLine, PurchLine |
Miscellaneous |
São dados que não se encaixam em nenhum dos grupos anteriores e é o valor default quando você cria uma tabela nova. |
TableExpImpDef |
[]s
Pichler