Mundo net - Integracao ERP e Windows 7

1,746 views

Published on

Esse artigo publicado na revista Mundo .NET apresenta a integração do ERP Software RM com recursos do Windows 7

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,746
On SlideShare
0
From Embeds
0
Number of Embeds
143
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Mundo net - Integracao ERP e Windows 7

  1. 1. 0 Windows 7 trouxe uma série de novos recursos que permitem uma maior integracdo dos aplicativos com este novo Sistema Operacional. Vamos mostrar neste ortigo como foi fe/ ‘ta a integrogoo do ERP R/ V1 com estas novos funcionalidodes, e quois forum as solugoes adotadas no processo de desenvolvirnento. rs: : i . . . . André Brews Nunes de Llma (end jiioivscorn br)‘ (5 dirctov de d? SClWClVII1i{‘V‘4'iO do IOIVS Graduuu-so om (Erma da Compumcéo em ‘997 Dela PUCMG u (0-"(]UiLJ um 2001 qostixo de neqooos 0: ll peia FGV Antes de ng'css.3r na TOTVS atuou rorno consultor em arqunrc-t. r.s e x. ‘v. ')’: i1‘. ‘O c "canto dc sof'. waro crn aigumasamorums. ifl(; !€SS. J!1’JD no IONS pals incorporaqao do RM “. rs7v: n;is Na RNA in UDU sua tnrrcuru {A-:1 1993 Como der do equipes Ce dP$l‘| '|‘J’.7|‘. ’Hi‘3TY0 de soft»-we 0 rus(crr1ize(.3.o, lanto urn . ‘| in.1sL3era>s L0fY70 em Sm F. )u‘o Rogerlo de Resende Ohashl isms? ‘ : 'o: vs: <;m hr) 6 Jnaiism (:0 s siemas do equnpe do (1 go . memo d‘. ‘F'V3V1iP/ Olk do Lmha RM Com ma 5 do IO . mos de exp-: ’vI». "-i". ci. a ro desen-. /civimenm (Ir: Fume ‘irks, IligVt. ‘$SO. A ra RM hi c -no. Ufiilitipdiido cesde o im; u do JL-', L) do mima; ;io da da no Software HM aimn dcouuos p'o‘r. -los (C. -mo as ms :1; . i,Mo. ~s 0 Pv'. :s"m, ".s do [39 Possui 35 . _r1fic3;oe'-s C15» ‘O . .!Ii‘. 'O nos fovuvts -; us (Cmunrdddc MSGN Eirasil, rn um Non so‘:7'c Dcs». -nvoivimenio dsandn a piax. -.‘o! ma N[T, iniaturas de janelas, listas de saltos, icones agrupados, Apos uma anélise das funcionalidades disponiveis, decidimos controle de recuperaqao de falhas, séo muitos implementar os recursos de miniaturas dejaneias, recurso este que os novos recursos do Windows 7 que podemos permite mostrar um 'preview”de todas as janelas abertas pela MDI integrar com as nossas aplicagoes. Diame de tantas da apiicagao. Além da miniatura, e’ possivel mostrar a imagem da possibilidades, quais sao os recursos que seriam mais janela no tamanho original ao passar 0 mouse sobre a miniatura. interessantes no ponto de vista do usuario de um Outro recurso interessante séo as Iistas de saltos ou Jump Lists, que ERP? Vamos ver na pratica os recursos adotados e permitem montar uma lista de comandos da aplicagao ao clicar as solucoes escolhidas na implementagéo de cada com o botéo direito do mouse sobre o fcone da aplicaqéo na barra recurso integrado. de tarefas. Dentro dos novos recursos visuais, vamos adicionar ', .= =:—_—. : — ': ~.. ~:: ’: rx-C- _ . ::. -.: :- 7.—. v.n: .~ -_zs2_
  2. 2. : . ‘:. ‘-a. iantbént a funcionalidadc do barra de progresso, onde podemos exibir o cirpgresso do ex: -cticiro dos nossos processes clrretarriente '10 iconc do bdltd dc tarelras. Alem dos novos recursos vistiais. vamos ver coma l/1t’OU o nosso strporte 3 API de Rectrperagjo e Reinicio ApDllC8IlOll Restart and RE'CC. . ‘E‘t’ *Pl, ‘ no HKP. ltste recurso nos permite controlar O reinir to do : :pl: cac. io caso acontoca alguni problema durantc sud etectigtio, Nesta prirneira versiio. quartdo ocorrer algurn protilurna clcrrtro de Lima tcla dc catiastro da aplicacao, varnos salvar as rnorirficat; oes que 0 usuario fez no cadastrc) e rectipertflas apps 0 reiriicio da aplicaciao EHilJindo as miniaturas das janelas A atuiictacao Riv’. e coniposta poi trim tela principal pride temps urn cnntrole de janelas ancoradas iabertasi. Todas as telas abertas pelo ERP séo tnostradas dentro dc dbos rtestd tela principal, deste rricido, para cada am abcrta teriarnos que tor uma l‘li| iildlLlld no barre de laretds ltigura ii. Qada vez que uma nova janela da aplrcaqéo é aberta rrianms Lima classe labbecllliurnbnail para adicionar mais uma miniariira na barra dc? tarefas esta classe :3 responsavel poi respondc-r ans everitos do Windo' s onde devemos informor qual C a irnagcrrr do niiniattira do janelcr e responder aos eventos de ativacao e icnarixerito das janelas‘ '3'}. -, , . . _ -_ ‘_'_ ‘-*-‘ ” —, (D V * ' OJnA. ) urn». -r. ..-. ... Eriando atalhos para as tarefas mais acessadas O ERP tem uma arquitctura baseada ern Actions, cada Action rerzreserita uma lunciorialidacle do sistema, seja ela um cadastro, um processo ou qualquer outta operacéo. Nos arrnazenarnos na base de dados as intcrrnacoes de todas as vezes em que uma Action 5’ executada. Corn base nessas inforrnaigoes, podemos ntontar uma lista das Actions mais execuradas pelo usuario e assim criar a lista de saltos Uurnptisti, usando metodo Adduserlaslas do classe Jumpl ist, com as tarefas que 0 usuario mais utiliza (ligura 3). Uni item da lista de saltos nada rnais e que tim atallio do Windows. 0 CUE fizernos for inrpleinentar uma. chaniada do exer'irtai. rel do ar)| ic. i<; ao passariclo como parémetro .1 Action .2 scr L‘. ‘(: ‘(Lllfldd. A partir (lat, lventos OII3I3l‘flL‘l1IO[}dfdldelilllicdl5c‘]dt‘XlS[E' Lima insnmcin do aplicacfio aberta crn c><ccLic(ir, i r, - atraves dz? rnensagens do 't’i’rritlows rmssarrrcis para a instancia :3 nonre do Action our old dmrora executor. Stsndo assirn, qtrando 0 Listiario Clica no item do lista do salto, 0 Windows executa novamente a aplrcacéo passando 0 nonio (la Action corno ptrrarrietro e realizando a aqéo. mostrandn o progressu de enerzucéo dosrmpcessos Outta ftrrrcionalidacle do Windows i‘ do facil iritegragiio e p recurso de exibicéo do prociresso do execuctio no harm dc tarelas. Ele nos [j: ‘llii| Ic‘ mostrar o procrresso de mcectrcéo do {Old dirc-tgarn-aritc no bdrm do Wirt(lc)w<, A c-xisténcra do Lima tela do er‘‘C‘{. U(réL) de procossos padronizada uni nosso Fr. arriewc>rk nos permititi (rue todos os processos lossern int-emados is barra de tarelns de uma so ‘J54’. llTl[)| t‘lYl€llKdli(l(, )5OlY1‘3H[€‘HEl ancestral as cltarnadas das rotinas SctProt_rressState e 5etProqress‘. /nltre do API para attralizacao do progresso na barra do Winclows tfigrira st. v. .ur«. .¢. u.«. «. v. .~. ... ... ... . r r it lllllllllllllll * ” "llll Illlllllllllllllllllllllllllllllllllllllllllllll ll? "
  3. 3. l l API de Hecuperacén e Fleiniciu Imagine 0 seu usuario cadastrando uma nota fiscal no seu sisterna com 50 itens e quando ele clicar no botao para salvar os dados acontece algum erro e o sistema trava perdendo todas as informa- goes que ele digitou. Erros sao inevitaveis e podem acontecer por diversos motivos. E se nosso sisterna pudesse detectar uma falha e nos perrnitisse salvar o que o usuario estava fazendo para depois recuperar estes dados ”perdidos".7 Esta API nos permite fazer isto de maneira simples e facil. Com ela é possivel salvar os dados e 0 estado da nossa aplicagao, além de permitir que ela seja reiniciada automaticarnente ao acontecer alguma exceqéo nao tratada ou quando a aplicacao para de responder antes que ela seja terminada (figura 4). Podemos também através desta API controlar o reinicio da aph- caqao quando for feita alguma atualizagao ou quando for precise reiniciar o compurador apos a instalacao de alguma atualizagao. Este é um recurso que esta' disponivel a partir do Windows Vista, mas que foi disponibilizado juntamente com as AP| s do Windows 7. Ele usa um recurso chamado“Windows Error Reporting (W[R)", que perrnite ao usuario notiftcar a Microsoft quando acontece alguma falha na aplicagéo, no kernel do windows ou quando alguma aplicacéo de terceiros trava alérn de outros problemas. Quando algum destes problemas acontece, o WER notifica a nossa aplicagao através de um Callback (Mensagem de Retorno) informando que aconteceu um erro e a aplicagao sera finalizada. Neste Callback podemos acessar os objetos que estao na rnemoria da nossa aplicacao e guardar os dados nao salvos. Hegistrandu a aplicacéu para ser recuperacla Para que a nossa aplicaqao seja notificada quando uma falha ocorrer precisamos registra-la junto ao WER. Para isto, devemos passar uma funcao de callback que sera chamada qtiando a falha acontecer. Dentro cleste callback poderemos acessar os objetos que estao na memoria da aplicacao. No nosso caso como os cadastros sao baseados em DataSets, optamos por salvar O$ dados alterados do DataSet em urn arquivo para depois recupera~| os. Na inicializagéo do nosso sistema, colocamos a charnada para registrar a recuperagao, Listagem l. Temos tarnbérn que informar que a aplicacéo precisa ser reiniciada, conforrne Listagem 2. Listagem1.Registrodarewpera;5odeerros. ‘ ll inicializa os dados para recuperagéo com o ponteiro e um estado qual» quer. .s Recoveryoata data = new RecoveryData(new Re-coveryCal| back(this. Reco« veryProcedure), null); / I cria o objeto de conliguracées da recuperaqao. .. Recoverysettings settings = new RecoverySet1ings(data. 0): / / registra no WER. .. ApplicationRestartRecoveryManager. RegisterForApp| icationRecovery(setti H95): Listagem 2. lnfomiando a aplicagao do reinldo. ‘ ‘ ApplicationRestartRecoveryManager. RegisterForApplicationRestart( new RestartSettings(string. Formatl"/ restart (0)”, this. Session| D), RestartRestrictions. Not0nReboot | RestartRestrictions. Not0nPatch));
  4. 4. Optamos em criar um Guid(nt1rmero gerado automaticamente nao havendo repetigao) por sessao da aplicagao para controlar o nome do arquivo que sera criado pela recuperagao. Entao identificamos que o programa foi reiniciado através do parametro '/ restart” acrescido do Guid da sessao. Podemos controlar também se é necessario reiniciar a aplicagao quando o computador e’ reiniciado ou quando é feita uma atualizacao no sistema. Entao sabemos que a aplicacao foi reiniciada verificando os ‘parametros passados como argumentos apos a sua inicializacao, lcaso o parametro“/ restart"tenha sido informado além do ID da isessao, conforme demonstrado na Listagem 3. l Listagem 3.Verificando se a aplicagéo esté em reinicio. if (System. Environinent. GetComrnandLineArgs(). Length > 2 && System. Environment. Get(ommandLineArgs()[1] = = “/ restart") l this. Rec0vered = true; / I passa 0 Id da sessao para fazer a recupera(ao. ,. this. RecoverLastSession(Systen1.Environment. GetCommandLineArgs(ll2]); l private bool Recovered : false; Apos as devidas inicializagées, temos que salvar os dados dentro do callback, a fungao RecoveryProcedure sera chamada pelo WER e neste momento temos que saber as telas do sistema que estavam abertas e se elas possuiam algum dado importante néo salvo. Além disto, durante a recuperacao, devemos informar ao WER que a aplicacao esté sendo recuperada através do método Applicatio- nRecoverylnProgress, devemos verificar também se 0 usuario nao cancelou a recuperaqao através do retorno deste método. Para saber o que esté aberto na aplicacao, guardamos em uma lista estatica os formularios quando sao abertos e removemos da lista quando ele e’ fechado. Nao podemos usar a propriedade Applica~ tion. OpenForms porque no momento do Callback, ela nao contém nenhuma informagao. Sendo assim, so verificamos esta lista e vemos se 0 DataSet relacionado ao formulario contém alguma alteracao e guardamos no arquivo da sessao. Listagem 4. Salvando o estado atual da aplicagéo. / // ~: surnmary: - / // Funcao chamada quando algtlrna lalha acontece / // -: /5ummary> / // <param narne= "state": »Valor do PSt€l(l0 passado na classe RecoveryDa- tax‘/ param: » / // -: returns; »O returrio nao é usarlo devendo sernpre ser O. <lreturns> private int RecoveryProcedure(object stale) l / / notilica 0 WER que aplicagao mm sendo fC(llp(. ’lflda. .. ApplicatlonRestartRe<overyManager. ApplicationRe<overylnProgressl) ll guarda os dados para recuporacao. .. if (this. RecoveryData ! = null && this. RecovoryData. Count : - 0) l Rli‘lSRecoveryData data = new RMSRecoveryData(); data. UserlD : RM. Lrb. Client. RMSSessi0n. Context. CodUsuario; data. ConnectionlD : l(CorpnrePrirrcipallsystein. Threading. Thread. CurrentPrincipal). Connc-ctionld; data. Data : this. RecoveryData; / / monta 0 name do arquivo. .. string ltleName = string. Forrnat("lOlRc= (overylll data", Path. GetDirectoryName-(Application. Exe(utablePalh), tl1is. SessionlD), ' / / cria 0 diretério_. if llDirectory. Exists(Path. GetDirectoryName(li| eNnme))) Directory. CreateDirectory(F’ath. GetDirectoryName(fileNainel); / / serializa. .. Binaryformalter lormatter : new BlnaryFormatter(); using (FileStream stream : new Fil9Slream(lilr3Narne, FileMode. Create, FrleAccess. Wrrte)) formatter. Seriallzolstream, data): l Alem dos dados do DataSet, para garantir a seguranca, guardamos neste arquivo o nome do usuario e a sua conexéo no momento da recuperagao para verificar case 0 usua'rio entre na aplicagao usando outra conexao ou conta diferente furando a seguranqa destes dados, segundo Listagem 4 e frgura 5. E por ultimo ternos que fazer a recuperacao do sistema em si. Como vimos anteriormente, verificarnos durante a inicializagao que a aplicagao foi reiniciada através do argumento "/ restart"e chamamos o método RecoverLastSession passando 0 ID da sessao recuperada. A partir deste ID verificamos se 0 arquivo existe para se fazer a recuperaqao, Listagem 5 e figura 6.
  5. 5. V —. -s: .%-. :. ==: ..: ~, , -.3-_ ; .'. ::: ;;' II II Listagem S. Realizanclo a recuperacéo do estado da aplicacao. private void RecoverLastSession(string command) I II monta o nome do arquivo. .. string li| eName = string. Format("I0}Recoveryll ). data", Path. GetDirectoryNameIApplication. Executab| ePath), command); / / verifica se 0 arquivo de recuperacao existe. .. if (File. Exists(fileName)) I W / / recupera os dados. .. Binaryformatter formatter : new BinaryFormatter(), ' RMSRecoveryData recoveryData = null; using (FileStrc-am stream = new FileStreain(fileName, Fi| eMode. Open, Fi| eA((ess. Read)) recoveryData : (RMSRecoveryData)lorrnatter. Deserializetstream); / / verilica se deve recuperar. .. if (RMSMessage. ContirrnYES("A execugao termlnou de Iorma inesperada, deseja recuperar os dados nao salvos? ")) I / / verilica se e’ 0 mesmo usuarlo. .. il (strrng. Compare(recoveryData. UserID, RM. Lib. Client. RMS» Session. Context. CodUsuario) I: 0) I RMSNlessagc-. SlrowWarning("A sessao nao podera ser rectiperada porque vocé entrou com um usuario diferente! "); else if (string. Compare(recoveryData. Connection| D, RM. Lib. Client. RMSSession. Context. Connectionld) I: 0) I RMSMessage. ShowWarning("A sessao nao podera ser rocuperada porque vocé entrou em uma conexao diferentel”); I else I l / / recupera a execucao. .. I I finally I / / apaga o arquivo. .. FiIe. Delete(fileName); http: l/code. msdn. microsoft. com/ WindowsAP| Code- Pack http: //www. microsoft. com/ brasil/ windows7/ we. ..’ 6-.3-i'. u:; . '> http: //blog. ohashi. com. br http: //twittencom/ totvsconnect Bnnsideracfies Finals Além da integragao com a barra de tarefas, existem muitas outras possibilidades de integragao com 0 Windows 7 que permitem aos nossos aplicativos serem mais dinarnicos, facets de usar e confiaveis dando uma experiéncia de uso muito melhor aos nossos usuérios. 0 Windows API Code Pack facilita muito a integragao de aplicacoes . NET com estas APIS e ja' conta com a maioria das APIS do Windows. I

×