.comment-link {margin-left:.6em;}

Thursday, May 19, 2005

Dúvida - Merge

Irei quebrar a sequência sobre statspack que estou escrevendo para responder uma dúvida que chegou. Relembrando, as dúvidas têm prioridade sobre os artigos.

Autor: Alexandre Taleb
A dúvida.


"
Eu criei uma tabela duas tabelas, uma temporária (CASE_STG_REQ_TEMP) e outra definitiva (CASE_STG_REQ_DEF) :


CREATE TABLE CASE_STG_REQ_TEMP
(
COUNTRYCODE VARCHAR2(3),
ATEN_NU_PTO NUMBER(10),
SEGM_CD NUMBER(3),
FASE_NU_SEQ NUMBER(3),
RESO_NU_SEQ NUMBER(3),
RESO_TE_REQ VARCHAR2(20),
RESO_TE_ATEN VARCHAR2(30)

)


CREATE TABLE CASE_STG_REQ_DEF
(
COUNTRYCODE VARCHAR2(3),
ATEN_NU_PTO NUMBER(10),
SEGM_CD NUMBER(3),
FASE_NU_SEQ NUMBER(3),
RESO_NU_SEQ NUMBER(3),
RESO_TE_REQ VARCHAR2(20),
RESO_TE_ATEN VARCHAR2(30), CONSTRAINT CASE_STG_REQ_TEMP PRIMARY KEY(ATEN_NU_PTO, FASE_NU_SEQ, RESO_NU_SEQ)

)


A TEMP recebe dados de um arquivo TXT e antes de ser carregada pelo SQLLOADER é executado o comando truncate para esvazia-la.
Depois de carregada deve haver um script para inserir os dados da tabela TEMP para a tabela definitiva., porém a tabela TEMP pode receber dados atualizados de registros que já estão na tabela definitiva, por exemplo o sistema fonte atualizou a descrição da requisição. (RESO_TE_REQ / Descrição da Requisição)

Tabela temporária (Nova carga)

COUNTRYCODE, ATEN_NU_PTO, SEGM_CD, FASE_NU_SEQ, RESO_NU_SEQ, RESO_TE_REQ, RESO_TE_ATEN
BR, 35, 1, 1, 1, VERIFICAR NOME VS, si


Tabela definitiva (Carga antiga)

COUNTRYCODE, ATEN_NU_PTO, SEGM_CD, FASE_NU_SEQ, RESO_NU_SEQ, RESO_TE_REQ, RESO_TE_ATEN
BR, 35, 1, 1, 1, VERIFICAR Ne VS, si

Veja que os registros chave são idênticos e o oracle não vai inserir esse registro sendo assim a descrição da requisição ficará VERIFICAR Ne VS ao invés de corrigida como VERIFICAR NOME VS.

A idéia seria verificar esse registro na tabela temporária e se a definitiva já tem esse registro, excluir da definitiva e depois inserir o novo registro da temp para a definitiva, ou seja uma atualização do registro na definitiva já que a temporária será apagada a cada nova carga.
"


Recebi ainda do autor os arquivos texto para o teste e o CTL (control do sql loader).
Ele está na versão 9ir2, portanto a opção MERGE está disponível.

Vamos ao exemplo:

ops$marcio@ORA10G> CREATE TABLE CASE_STG_REQ_TEMP
2 (
3 COUNTRYCODE VARCHAR2(3),
4 ATEN_NU_PTO NUMBER(10),
5 SEGM_CD NUMBER(3),
6 FASE_NU_SEQ NUMBER(3),
7 RESO_NU_SEQ NUMBER(3),
8 RESO_TE_REQ VARCHAR2(20),
9 RESO_TE_ATEN VARCHAR2(30)
10 )
11 /

Table created.

ops$marcio@ORA10G>
ops$marcio@ORA10G> CREATE TABLE CASE_STG_REQ_DEF
2 (
3 COUNTRYCODE VARCHAR2(3),
4 ATEN_NU_PTO NUMBER(10),
5 SEGM_CD NUMBER(3),
6 FASE_NU_SEQ NUMBER(3),
7 RESO_NU_SEQ NUMBER(3),
8 RESO_TE_REQ VARCHAR2(20),
9 RESO_TE_ATEN VARCHAR2(30), CONSTRAINT CASE_STG_REQ_TEMP PRIMARY KEY(ATEN_NU_PTO, FASE_NU_SEQ, RESO_NU_SEQ)
10 )
11 /

Table created.

Agora, simulando sua carga de dados inicial. Não é necessário truncar a tabela como voce havia mencionado, o seu ctl já está fazendo isso para voce, veja logo abaixo que está explícito o TRUNCATE.
Se alguém estiver interessado em reproduzir o exemplo, aqui estão os arquivos de dados (dw.txt) e o control (dw.ctl)

--- dw.ctl
LOAD DATA
INFILE "C:\scripts\blog\question\DW.txt"
TRUNCATE
INTO TABLE CASE_STG_REQ_TEMP

(
countrycode Position (1:3) CHAR,
aten_nu_pto Position (4:13) INTEGER EXTERNAL,
segm_cd Position (14:16) INTEGER EXTERNAL,
fase_nu_seq Position (17:19) INTEGER EXTERNAL,
reso_nu_seq Position (20:22) integer external,
reso_te_req Position (23:42) CHAR,
reso_te_aten Position (43:149)CHAR
)
---

--- dw.txt
CO 35 1 1 1 VERIFICAR NOMBRE VS si
CO 38 1 1 1 VERIFICAR NOMBRE VS si
CO 42 1 1 1 AUTORIZACION CARDS Ssi
CO 47 1 1 1 NUMERO DE CTA A DEBI4.8743e13
CO 48 1 1 1 AUTORIZACION CARDS Ssi
CO 53 1 1 1 AUTORIZACION CARDS Ssi
CO 54 1 1 1 AUTORIZACION CARDS Ssi
CO 57 1 1 1 AUTORIZACION CARDS Ssi
CO 74 1 1 1 AUTORIZACION CARDS Sok
CO 86 1 1 1 AUTORIZACION CARDS Sok
CO 90 1 1 1 AUTORIZACION CARDS Sok
CO 95 1 1 1 VERIFICAR NOMBRE VS 1
CO 113 1 1 1 AUTORIZACION CARDS Sok
CO 122 1 1 1 AUTORIZACION CARDS Sok
CO 124 1 1 1 VERIFICAR NOMBRE VS ok
CO 125 1 1 1 AUTORIZACION CARDS Sok
CO 126 1 1 1 VERIFICAR NOMBRE VS ok
CO 128 1 1 1 AUTORIZACION CARDS Sok
CO 186 1 1 1 AUTORIZACION CARDS Sok
CO 204 1 1 1 AUTORIZACION CARDS Sok
CO 206 1 1 1 AUTORIZACION CARDS Sok
CO 228 1 1 1 VERIFICAR NOMBRE VS ok
CO 237 1 1 1 AUTORIZACION CARDS Sok
CO 239 1 1 1 AUTORIZACION CARDS Sok
CO 247 1 1 1 AUTORIZACION CARDS Sok
CO 326 1 1 1 TEST_REQUISITO_RAUL ewfewfwer
CO 327 1 1 1 Antiguedad 31 - 60 DIAS
---

ops$marcio@ORA10G> host sqlldr userid=/ control=dw.ctl data=dw.txt

SQL*Loader: Release 10.1.0.2.0 - Production on Thu May 19 02:50:21 2005

Copyright (c) 1982, 2004, Oracle. All rights reserved.

Commit point reached - logical record count 28

ops$marcio@ORA10G>
ops$marcio@ORA10G> select * from case_stg_req_temp;

COU ATEN_NU_PTO SEGM_CD FASE_NU_SEQ RESO_NU_SEQ RESO_TE_REQ RESO_TE_ATEN
--- ------------- ------------- ------------- ------------- -------------------- ------------------------------
CO 35 1 1 1 VERIFICAR NOMBRE VS si
CO 38 1 1 1 VERIFICAR NOMBRE VS si
CO 42 1 1 1 AUTORIZACION CARDS S si
CO 47 1 1 1 NUMERO DE CTA A DEBI 4.8743e13
CO 48 1 1 1 AUTORIZACION CARDS S si
CO 53 1 1 1 AUTORIZACION CARDS S si
CO 54 1 1 1 AUTORIZACION CARDS S si
CO 57 1 1 1 AUTORIZACION CARDS S si
CO 74 1 1 1 AUTORIZACION CARDS S ok
CO 86 1 1 1 AUTORIZACION CARDS S ok
CO 90 1 1 1 AUTORIZACION CARDS S ok
CO 95 1 1 1 VERIFICAR NOMBRE VS 1
CO 113 1 1 1 AUTORIZACION CARDS S ok
CO 122 1 1 1 AUTORIZACION CARDS S ok
CO 124 1 1 1 VERIFICAR NOMBRE VS ok
CO 125 1 1 1 AUTORIZACION CARDS S ok
CO 126 1 1 1 VERIFICAR NOMBRE VS ok
CO 128 1 1 1 AUTORIZACION CARDS S ok
CO 186 1 1 1 AUTORIZACION CARDS S ok
CO 204 1 1 1 AUTORIZACION CARDS S ok
CO 206 1 1 1 AUTORIZACION CARDS S ok
CO 228 1 1 1 VERIFICAR NOMBRE VS ok
CO 237 1 1 1 AUTORIZACION CARDS S ok
CO 239 1 1 1 AUTORIZACION CARDS S ok
CO 247 1 1 1 AUTORIZACION CARDS S ok
CO 326 1 1 1 TEST_REQUISITO_RAUL ewfewfwer
CO 327 1 1 1 Antiguedad 31 - 60 DIAS

27 rows selected.

Uma vez carregada a tabela, vou criar uma procedure para o MERGE da tabela legado com a tabela transiente.

ops$marcio@ORA10G> create or replace procedure do_merge
2 as
3 begin
4 merge into case_stg_req_def def
5 using case_stg_req_temp tmp
6 on ( def.aten_nu_pto = tmp.aten_nu_pto
7 and def.FASE_NU_SEQ = tmp.FASE_NU_SEQ
8 and def.RESO_NU_SEQ = tmp.RESO_NU_SEQ )
9 when matched then
10 update set def.countrycode = tmp.countrycode
11 , def.segm_cd = tmp.segm_cd
12 , def.reso_te_req = tmp.reso_te_req
13 , def.reso_te_aten= tmp.reso_te_aten
14 when not matched then
15 insert (def.COUNTRYCODE, def.ATEN_NU_PTO, def.SEGM_CD, def.FASE_NU_SEQ,
16 def.RESO_NU_SEQ, def.RESO_TE_REQ, def.RESO_TE_ATEN)
17 values (tmp.COUNTRYCODE, tmp.ATEN_NU_PTO, tmp.SEGM_CD, tmp.FASE_NU_SEQ,
18 tmp.RESO_NU_SEQ, tmp.RESO_TE_REQ, tmp.RESO_TE_ATEN);
19 end;
20 /

Procedure created.

ops$marcio@ORA10G> show error
No errors.
ops$marcio@ORA10G>
ops$marcio@ORA10G> select * from case_stg_req_def;

no rows selected

Tabela vazia.

ops$marcio@ORA10G> exec do_merge;

PL/SQL procedure successfully completed.

ops$marcio@ORA10G> select * from case_stg_req_def;

COU ATEN_NU_PTO SEGM_CD FASE_NU_SEQ RESO_NU_SEQ RESO_TE_REQ RESO_TE_ATEN
--- ------------- ------------- ------------- ------------- -------------------- ------------------------------
CO 90 1 1 1 AUTORIZACION CARDS S ok
CO 327 1 1 1 Antiguedad 31 - 60 DIAS
CO 247 1 1 1 AUTORIZACION CARDS S ok
CO 54 1 1 1 AUTORIZACION CARDS S si
CO 74 1 1 1 AUTORIZACION CARDS S ok
CO 48 1 1 1 AUTORIZACION CARDS S si
CO 204 1 1 1 AUTORIZACION CARDS S ok
CO 53 1 1 1 AUTORIZACION CARDS S si
CO 42 1 1 1 AUTORIZACION CARDS S si
CO 126 1 1 1 VERIFICAR NOMBRE VS ok
CO 35 1 1 1 VERIFICAR NOMBRE VS si
CO 326 1 1 1 TEST_REQUISITO_RAUL ewfewfwer
CO 239 1 1 1 AUTORIZACION CARDS S ok
CO 57 1 1 1 AUTORIZACION CARDS S si
CO 228 1 1 1 VERIFICAR NOMBRE VS ok
CO 206 1 1 1 AUTORIZACION CARDS S ok
CO 122 1 1 1 AUTORIZACION CARDS S ok
CO 186 1 1 1 AUTORIZACION CARDS S ok
CO 38 1 1 1 VERIFICAR NOMBRE VS si
CO 86 1 1 1 AUTORIZACION CARDS S ok
CO 124 1 1 1 VERIFICAR NOMBRE VS ok
CO 47 1 1 1 NUMERO DE CTA A DEBI 4.8743e13
CO 113 1 1 1 AUTORIZACION CARDS S ok
CO 128 1 1 1 AUTORIZACION CARDS S ok
CO 125 1 1 1 AUTORIZACION CARDS S ok
CO 95 1 1 1 VERIFICAR NOMBRE VS 1
CO 237 1 1 1 AUTORIZACION CARDS S ok

27 rows selected.

Agora completa com a tabela temporária. Próximo passo, simular sua carga diária. Vamos fazer isso em 2 etapas. A primeira, carregando o registro BR 100 ... com uma descrição e o segundo, trazendo o mesmo registro (PK) porém com a alteração da descrição -- como voce colocou na dúvida.
A simulação acontece assim, criei 3 arquivos .TXT o dw0 original, dw1 com o registro novo, dw2 com o registro a ser atualizado.

ops$marcio@ORA10G> host copy dw1.txt dw.txt
1 file(s) copied.

ops$marcio@ORA10G> host sqlldr userid=/ control=dw.ctl data=dw.txt

SQL*Loader: Release 10.1.0.2.0 - Production on Thu May 19 02:50:27 2005

Copyright (c) 1982, 2004, Oracle. All rights reserved.

Commit point reached - logical record count 1

ops$marcio@ORA10G> select * from case_stg_req_temp;

COU ATEN_NU_PTO SEGM_CD FASE_NU_SEQ RESO_NU_SEQ RESO_TE_REQ RESO_TE_ATEN
--- ------------- ------------- ------------- ------------- -------------------- ------------------------------
BR 100 1 1 1 VERIFICAR NOMBRE VS si

1 row selected.

ops$marcio@ORA10G> exec do_merge

PL/SQL procedure successfully completed.

ops$marcio@ORA10G> select * from case_stg_req_def;

COU ATEN_NU_PTO SEGM_CD FASE_NU_SEQ RESO_NU_SEQ RESO_TE_REQ RESO_TE_ATEN
--- ------------- ------------- ------------- ------------- -------------------- ------------------------------
CO 90 1 1 1 AUTORIZACION CARDS S ok
CO 327 1 1 1 Antiguedad 31 - 60 DIAS
CO 247 1 1 1 AUTORIZACION CARDS S ok
CO 54 1 1 1 AUTORIZACION CARDS S si
CO 74 1 1 1 AUTORIZACION CARDS S ok
CO 48 1 1 1 AUTORIZACION CARDS S si
CO 204 1 1 1 AUTORIZACION CARDS S ok
CO 53 1 1 1 AUTORIZACION CARDS S si
CO 42 1 1 1 AUTORIZACION CARDS S si
CO 126 1 1 1 VERIFICAR NOMBRE VS ok
CO 35 1 1 1 VERIFICAR NOMBRE VS si
CO 326 1 1 1 TEST_REQUISITO_RAUL ewfewfwer
CO 239 1 1 1 AUTORIZACION CARDS S ok
CO 57 1 1 1 AUTORIZACION CARDS S si
CO 228 1 1 1 VERIFICAR NOMBRE VS ok
CO 206 1 1 1 AUTORIZACION CARDS S ok
CO 122 1 1 1 AUTORIZACION CARDS S ok
CO 186 1 1 1 AUTORIZACION CARDS S ok
CO 38 1 1 1 VERIFICAR NOMBRE VS si
CO 86 1 1 1 AUTORIZACION CARDS S ok
CO 124 1 1 1 VERIFICAR NOMBRE VS ok
CO 47 1 1 1 NUMERO DE CTA A DEBI 4.8743e13
CO 113 1 1 1 AUTORIZACION CARDS S ok
CO 128 1 1 1 AUTORIZACION CARDS S ok
CO 125 1 1 1 AUTORIZACION CARDS S ok
CO 95 1 1 1 VERIFICAR NOMBRE VS 1
CO 237 1 1 1 AUTORIZACION CARDS S ok
BR 100 1 1 1 VERIFICAR NOMBRE VS si

28 rows selected.

ops$marcio@ORA10G>
ops$marcio@ORA10G> host copy dw2.txt dw.txt
1 file(s) copied.

ops$marcio@ORA10G> host sqlldr userid=/ control=dw.ctl data=dw.txt

SQL*Loader: Release 10.1.0.2.0 - Production on Thu May 19 02:50:32 2005

Copyright (c) 1982, 2004, Oracle. All rights reserved.

Commit point reached - logical record count 1

ops$marcio@ORA10G> select * from case_stg_req_temp;

COU ATEN_NU_PTO SEGM_CD FASE_NU_SEQ RESO_NU_SEQ RESO_TE_REQ RESO_TE_ATEN
--- ------------- ------------- ------------- ------------- -------------------- ------------------------------
BR 100 1 1 1 VERIFICAR NE VS si

1 row selected.

ops$marcio@ORA10G> exec do_merge

PL/SQL procedure successfully completed.

ops$marcio@ORA10G> select * from case_stg_req_def;

COU ATEN_NU_PTO SEGM_CD FASE_NU_SEQ RESO_NU_SEQ RESO_TE_REQ RESO_TE_ATEN
--- ------------- ------------- ------------- ------------- -------------------- ------------------------------
CO 90 1 1 1 AUTORIZACION CARDS S ok
CO 327 1 1 1 Antiguedad 31 - 60 DIAS
CO 247 1 1 1 AUTORIZACION CARDS S ok
CO 54 1 1 1 AUTORIZACION CARDS S si
CO 74 1 1 1 AUTORIZACION CARDS S ok
CO 48 1 1 1 AUTORIZACION CARDS S si
CO 204 1 1 1 AUTORIZACION CARDS S ok
CO 53 1 1 1 AUTORIZACION CARDS S si
CO 42 1 1 1 AUTORIZACION CARDS S si
CO 126 1 1 1 VERIFICAR NOMBRE VS ok
CO 35 1 1 1 VERIFICAR NOMBRE VS si
CO 326 1 1 1 TEST_REQUISITO_RAUL ewfewfwer
CO 239 1 1 1 AUTORIZACION CARDS S ok
CO 57 1 1 1 AUTORIZACION CARDS S si
CO 228 1 1 1 VERIFICAR NOMBRE VS ok
CO 206 1 1 1 AUTORIZACION CARDS S ok
CO 122 1 1 1 AUTORIZACION CARDS S ok
CO 186 1 1 1 AUTORIZACION CARDS S ok
CO 38 1 1 1 VERIFICAR NOMBRE VS si
CO 86 1 1 1 AUTORIZACION CARDS S ok
CO 124 1 1 1 VERIFICAR NOMBRE VS ok
CO 47 1 1 1 NUMERO DE CTA A DEBI 4.8743e13
CO 113 1 1 1 AUTORIZACION CARDS S ok
CO 128 1 1 1 AUTORIZACION CARDS S ok
CO 125 1 1 1 AUTORIZACION CARDS S ok
CO 95 1 1 1 VERIFICAR NOMBRE VS 1
CO 237 1 1 1 AUTORIZACION CARDS S ok
BR 100 1 1 1 VERIFICAR NE VS si

28 rows selected.

Feito, o último registro, como pode ser notado, foi atualizado corretamente.
Mais uma dica, ao invés de usar o sql loader, use o recurso da external table. Com o ctl, fica ainda mais fácil de gerar a DDL de criação da tabela basta voce pedir ao sqlldr com o parâmetro external_table=generate_only. Com isso, quando seu processo quando colocar o novo dw.txt a tabela temporária já estará pronta para o merge sem a necessidade de voce executar o loader.

ops$marcio@ORA10G> host sqlldr userid=/ control=dw.ctl external_table=generate_only

SQL*Loader: Release 10.1.0.2.0 - Production on Thu May 19 02:51:32 2005

Copyright (c) 1982, 2004, Oracle. All rights reserved.


ops$marcio@ORA10G> host type dw.log

SQL*Loader: Release 10.1.0.2.0 - Production on Thu May 19 02:51:32 2005

Copyright (c) 1982, 2004, Oracle. All rights reserved.

Control File: dw.ctl
Data File: C:\scripts\blog\question\DW.txt
Bad File: DW.bad
Discard File: none specified

(Allow all discards)

Number to load: ALL
Number to skip: 0
Errors allowed: 50
Continuation: none specified
Path used: External Table

Table CASE_STG_REQ_TEMP, loaded from every logical record.
Insert option in effect for this table: TRUNCATE

Column Name Position Len Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
COUNTRYCODE 1:3 3 CHARACTER
ATEN_NU_PTO 4:13 10 CHARACTER
SEGM_CD 14:16 3 CHARACTER
FASE_NU_SEQ 17:19 3 CHARACTER
RESO_NU_SEQ 20:22 3 CHARACTER
RESO_TE_REQ 23:42 20 CHARACTER
RESO_TE_ATEN 43:149 107 CHARACTER



CREATE DIRECTORY statements needed for files
------------------------------------------------------------------------
CREATE DIRECTORY SYS_SQLLDR_XT_TMPDIR_00000 AS 'c:\scripts\blog\question'
CREATE DIRECTORY SYS_SQLLDR_XT_TMPDIR_00000 AS 'C:\scripts\blog\question\'


CREATE TABLE statement for external table:
------------------------------------------------------------------------
CREATE TABLE "SYS_SQLLDR_X_EXT_CASE_STG_REQ_"
(
"COUNTRYCODE" VARCHAR2(3),
"ATEN_NU_PTO" NUMBER(10),
"SEGM_CD" NUMBER(3),
"FASE_NU_SEQ" NUMBER(3),
"RESO_NU_SEQ" NUMBER(3),
"RESO_TE_REQ" VARCHAR2(20),
"RESO_TE_ATEN" VARCHAR2(30)
)
ORGANIZATION external
(
TYPE oracle_loader
DEFAULT DIRECTORY SYS_SQLLDR_XT_TMPDIR_00000
ACCESS PARAMETERS
(
RECORDS DELIMITED BY NEWLINE CHARACTERSET WE8MSWIN1252
BADFILE 'SYS_SQLLDR_XT_TMPDIR_00000':'DW.bad'
LOGFILE 'dw.log_xt'
READSIZE 1048576
FIELDS LDRTRIM
REJECT ROWS WITH ALL NULL FIELDS
(
"COUNTRYCODE" (1:3) CHAR(3),
"ATEN_NU_PTO" (4:13) INTEGER EXTERNAL(10),
"SEGM_CD" (14:16) INTEGER EXTERNAL(3),
"FASE_NU_SEQ" (17:19) INTEGER EXTERNAL(3),
"RESO_NU_SEQ" (20:22) INTEGER EXTERNAL(3),
"RESO_TE_REQ" (23:42) CHAR(20),
"RESO_TE_ATEN" (43:149) CHAR(107)
)
)
location
(
'DW.txt'
)
)REJECT LIMIT UNLIMITED


INSERT statements used to load internal tables:
------------------------------------------------------------------------
INSERT /*+ append */ INTO CASE_STG_REQ_TEMP
(
COUNTRYCODE,
ATEN_NU_PTO,
SEGM_CD,
FASE_NU_SEQ,
RESO_NU_SEQ,
RESO_TE_REQ,
RESO_TE_ATEN
)
SELECT
"COUNTRYCODE",
"ATEN_NU_PTO",
"SEGM_CD",
"FASE_NU_SEQ",
"RESO_NU_SEQ",
"RESO_TE_REQ",
"RESO_TE_ATEN"
FROM "SYS_SQLLDR_X_EXT_CASE_STG_REQ_"


statements to cleanup objects created by previous statements:
------------------------------------------------------------------------
DROP TABLE "SYS_SQLLDR_X_EXT_CASE_STG_REQ_"
DROP DIRECTORY SYS_SQLLDR_XT_TMPDIR_00000
DROP DIRECTORY SYS_SQLLDR_XT_TMPDIR_00000



Run began on Thu May 19 02:51:32 2005
Run ended on Thu May 19 02:51:37 2005

Elapsed time was: 00:00:05.06
CPU time was: 00:00:00.05

ops$marcio@ORA10G>

Comments:
Prezado Anakin Marcio Portes Skywalker: Percebi que ao sanar a minha dúvida, és um grande mestre na ferramenta. Ao me basear na sua solução, meu gerente de projetos na Argentina me perguntou:
"Puedes explicarme lo que és el commando merge ? Porque yo no conosco"....
Aí eu tive que explicar...
Abraços e segura que vou mandar outras dúvidas, Muito obrigado pela ajuda e cuidado com o lado negro da força!
Alexandre Taleb
 
:-)
 
Post a Comment



<< Home

This page is powered by Blogger. Isn't yours?