Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Замена данных в таблице.  [new]
andrepont
Member

Откуда:
Сообщений: 41
Здравствуйте. Есть две таблицы plan_izd и n_plan_izd необходимо перенести данные из таблицы plan_izd в n_plan_izd, при условии если запись с таким id_izd существует строку перезаписать, а если нет то создать строку и записать. Вот код что не так?
LOCATE FOR n_plan_izd.id_izd == plan_izd.id_izd
IF FOUND()
replace all n_plan_izd.id_izd WITH plan_izd.id_izd, ;
n_plan_izd.st_trud WITH plan_izd.st_trud, ;
n_plan_izd.plan_g WITH plan_izd.plan_g,  ;
n_plan_izd.plan_1kv WITH plan_izd.plan_1kv,  ;
n_plan_izd.plan_2kv WITH plan_izd.plan_2kv,  ;
n_plan_izd.plan_3kv WITH plan_izd.plan_3kv,  ;
n_plan_izd.plan_4kv WITH plan_izd.plan_4kv,  ;
n_plan_izd.plan_1m WITH plan_izd.plan_1m,  ;
n_plan_izd.plan_2m WITH plan_izd.plan_2m,  ;
n_plan_izd.plan_3m WITH plan_izd.plan_3m,  ;
n_plan_izd.plan_4m WITH plan_izd.plan_4m,  ;
n_plan_izd.plan_5m WITH plan_izd.plan_5m,  ;
n_plan_izd.plan_6m WITH plan_izd.plan_6m,  ;
n_plan_izd.plan_7m WITH plan_izd.plan_7m,  ;
n_plan_izd.plan_8m WITH plan_izd.plan_8m,  ;
n_plan_izd.plan_9m WITH plan_izd.plan_9m,  ;
n_plan_izd.plan_10m WITH plan_izd.plan_10m,  ;
n_plan_izd.plan_11m WITH plan_izd.plan_11m,  ;
n_plan_izd.plan_12m WITH plan_izd.plan_12m 
ELSE 
APPEND BLANK
replace all n_plan_izd.id_izd WITH plan_izd.id_izd, ;
n_plan_izd.st_trud WITH plan_izd.st_trud, ;
n_plan_izd.plan_g WITH plan_izd.plan_g,  ;
n_plan_izd.plan_1kv WITH plan_izd.plan_1kv,  ;
n_plan_izd.plan_2kv WITH plan_izd.plan_2kv,  ;
n_plan_izd.plan_3kv WITH plan_izd.plan_3kv,  ;
n_plan_izd.plan_4kv WITH plan_izd.plan_4kv,  ;
n_plan_izd.plan_1m WITH plan_izd.plan_1m,  ;
n_plan_izd.plan_2m WITH plan_izd.plan_2m,  ;
n_plan_izd.plan_3m WITH plan_izd.plan_3m,  ;
n_plan_izd.plan_4m WITH plan_izd.plan_4m,  ;
n_plan_izd.plan_5m WITH plan_izd.plan_5m,  ;
n_plan_izd.plan_6m WITH plan_izd.plan_6m,  ;
n_plan_izd.plan_7m WITH plan_izd.plan_7m,  ;
n_plan_izd.plan_8m WITH plan_izd.plan_8m,  ;
n_plan_izd.plan_9m WITH plan_izd.plan_9m,  ;
n_plan_izd.plan_10m WITH plan_izd.plan_10m,  ;
n_plan_izd.plan_11m WITH plan_izd.plan_11m,  ;
n_plan_izd.plan_12m WITH plan_izd.plan_12m 

endif
10 сен 18, 16:13    [21669995]     Ответить | Цитировать Сообщить модератору
 Re: Замена данных в таблице.  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1402
andrepont,
в коде, вроде бы, всё "так". Но вот вы совершенно ничего не рассказали о причинах поиска "не так" в этом коде. Не обновляется? Не добавляется? Добавляется не то? Что-то еще?
10 сен 18, 16:31    [21670017]     Ответить | Цитировать Сообщить модератору
 Re: Замена данных в таблице.  [new]
andrepont
Member

Откуда:
Сообщений: 41
При выполнении кода нужно поочередно сравнить данные в таблице n_plan_izd с данными в таблице plan_izd если запись в поле n_plan_izd.id_izd=plan_izd.id_izd то поля в этой строке нужно заменить, а если <> то создать новую строку. А у меня при выполнении этого не происходит. Может перед locate нужно scan select plan_izd добавить?
10 сен 18, 16:50    [21670039]     Ответить | Цитировать Сообщить модератору
 Re: Замена данных в таблице.  [new]
Dima T
Member

Откуда:
Сообщений: 13354
andrepont
Здравствуйте. Есть две таблицы plan_izd и n_plan_izd необходимо перенести данные из таблицы plan_izd в n_plan_izd, при условии если запись с таким id_izd существует строку перезаписать, а если нет то создать строку и записать. Вот код что не так?

Не так вот что
replace all n_plan_izd.id_izd WITH plan_izd.id_izd, ;

all - это все записи таблицы

То что тебе надо пишется так
sele n_plan_izd
LOCATE FOR id_izd == plan_izd.id_izd
IF !FOUND()
   APPEND BLANK in n_plan_izd
endif

replace in n_plan_izd id_izd WITH plan_izd.id_izd, ;
   st_trud WITH plan_izd.st_trud, ;
   plan_g WITH plan_izd.plan_g,  ;
   plan_1kv WITH plan_izd.plan_1kv,  ;
   plan_2kv WITH plan_izd.plan_2kv,  ;
   plan_3kv WITH plan_izd.plan_3kv,  ;
   plan_4kv WITH plan_izd.plan_4kv,  ;
   plan_1m WITH plan_izd.plan_1m,  ;
   plan_2m WITH plan_izd.plan_2m,  ;
   plan_3m WITH plan_izd.plan_3m,  ;
   plan_4m WITH plan_izd.plan_4m,  ;
   plan_5m WITH plan_izd.plan_5m,  ;
   plan_6m WITH plan_izd.plan_6m,  ;
   plan_7m WITH plan_izd.plan_7m,  ;
   plan_8m WITH plan_izd.plan_8m,  ;
   plan_9m WITH plan_izd.plan_9m,  ;
   plan_10m WITH plan_izd.plan_10m,  ;
   plan_11m WITH plan_izd.plan_11m,  ;
   plan_12m WITH plan_izd.plan_12m 


PS Будет тормозить - поизучай что такое индексы и IndexSeek()
10 сен 18, 17:10    [21670062]     Ответить | Цитировать Сообщить модератору
 Re: Замена данных в таблице.  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7819
1. перед использованием команды locate надо явным образом перейти в рабочую область той таблицы, где будет выполняться поиск. В данном случае это, очевидно, n_plan_izd

select n_plan_izd
locate for (...)

2. Данные для сравнения из других рабочих областей, по умолчанию, будут взяты из текущей записи. ОДНО значение.

3. Использование в команде replace опции ALL без уточнения FOR или WHILE означает обновить ВСЕ записи таблицы

4. Использованный в качестве оператора сравнения символ тождественного равенства означает, что данные будут сравниваться включая концевые пробелы. Т.е. если у Вас размерность полей n_plan_izd.id_izd и plan_izd.id_izd разная, то равенство не будет выполнено никогда.

Обычно вполне достаточно простого сравнения. Т.е. одиночного символа равенства. Сильно сомневаюсь, что Вы используете поля типа VarChar.

Если стоит задача сравнения всех записей двух таблиц, то есть несколько вариантов. Зависит от постановки задачи, объема данных в таблицах и личных предпочтений программиста. Но в простейшем случае можно и через SCAN

select plan_izd
SCAN

    select n_plan_izd 
    LOCATE FOR n_plan_izd.id_izd = plan_izd.id_izd

    * Если запись не найдена, то создаем пустую запись
    if found() = .F.
        append blank
    end

    * Обновить реквизиты ОДНОЙ (текущей, найденной) записи (или только что созданной пустой записи)
    * Здесь опция ALL - не нужна
    replace n_plan_izd.id_izd WITH plan_izd.id_izd, ;
                n_plan_izd.st_trud WITH plan_izd.st_trud, ;
                    (...)


ENDSCAN
10 сен 18, 17:10    [21670063]     Ответить | Цитировать Сообщить модератору
 Re: Замена данных в таблице.  [new]
andrepont
Member

Откуда:
Сообщений: 41
Дописал вот так
SCAN
SELECT n_plan_izd
go top
LOCATE FOR n_plan_izd.id_izd == plan_izd.id_izd
IF FOUND()
replace n_plan_izd.id_izd WITH plan_izd.id_izd, ;
n_plan_izd.st_trud WITH plan_izd.st_trud, ;
n_plan_izd.plan_g WITH plan_izd.plan_g,  ;
n_plan_izd.plan_1kv WITH plan_izd.plan_1kv,  ;
n_plan_izd.plan_2kv WITH plan_izd.plan_2kv,  ;
n_plan_izd.plan_3kv WITH plan_izd.plan_3kv,  ;
n_plan_izd.plan_4kv WITH plan_izd.plan_4kv,  ;
n_plan_izd.plan_1m WITH plan_izd.plan_1m,  ;
n_plan_izd.plan_2m WITH plan_izd.plan_2m,  ;
n_plan_izd.plan_3m WITH plan_izd.plan_3m,  ;
n_plan_izd.plan_4m WITH plan_izd.plan_4m,  ;
n_plan_izd.plan_5m WITH plan_izd.plan_5m,  ;
n_plan_izd.plan_6m WITH plan_izd.plan_6m,  ;
n_plan_izd.plan_7m WITH plan_izd.plan_7m,  ;
n_plan_izd.plan_8m WITH plan_izd.plan_8m,  ;
n_plan_izd.plan_9m WITH plan_izd.plan_9m,  ;
n_plan_izd.plan_10m WITH plan_izd.plan_10m,  ;
n_plan_izd.plan_11m WITH plan_izd.plan_11m,  ;
n_plan_izd.plan_12m WITH plan_izd.plan_12m 
ELSE 
APPEND BLANK
replace n_plan_izd.id_izd WITH plan_izd.id_izd, ;
n_plan_izd.st_trud WITH plan_izd.st_trud, ;
n_plan_izd.plan_g WITH plan_izd.plan_g,  ;
n_plan_izd.plan_1kv WITH plan_izd.plan_1kv,  ;
n_plan_izd.plan_2kv WITH plan_izd.plan_2kv,  ;
n_plan_izd.plan_3kv WITH plan_izd.plan_3kv,  ;
n_plan_izd.plan_4kv WITH plan_izd.plan_4kv,  ;
n_plan_izd.plan_1m WITH plan_izd.plan_1m,  ;
n_plan_izd.plan_2m WITH plan_izd.plan_2m,  ;
n_plan_izd.plan_3m WITH plan_izd.plan_3m,  ;
n_plan_izd.plan_4m WITH plan_izd.plan_4m,  ;
n_plan_izd.plan_5m WITH plan_izd.plan_5m,  ;
n_plan_izd.plan_6m WITH plan_izd.plan_6m,  ;
n_plan_izd.plan_7m WITH plan_izd.plan_7m,  ;
n_plan_izd.plan_8m WITH plan_izd.plan_8m,  ;
n_plan_izd.plan_9m WITH plan_izd.plan_9m,  ;
n_plan_izd.plan_10m WITH plan_izd.plan_10m,  ;
n_plan_izd.plan_11m WITH plan_izd.plan_11m,  ;
n_plan_izd.plan_12m WITH plan_izd.plan_12m 

ENDIF
endscan

но почему то первую строку не записывает и в конце таблицы добавляет строку с нулями
10 сен 18, 17:12    [21670067]     Ответить | Цитировать Сообщить модератору
 Re: Замена данных в таблице.  [new]
Dima T
Member

Откуда:
Сообщений: 13354
andrepont
Дописал вот так

Надо так
SELECT plan_izd
SCAN
SELECT n_plan_izd
go top && Это лишнее
LOCATE FOR n_plan_izd.id_izd == plan_izd.id_izd
...
10 сен 18, 17:19    [21670083]     Ответить | Цитировать Сообщить модератору
 Re: Замена данных в таблице.  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1402
andrepont,
а теперь сравните ваши два replace'а. Вам не кажется, что в любом случае выполняется одно и тоже и что replace надо оставить один, но за endif?
10 сен 18, 17:20    [21670084]     Ответить | Цитировать Сообщить модератору
 Re: Замена данных в таблице.  [new]
andrepont
Member

Откуда:
Сообщений: 41
сейчас вот так:
select plan_izd
SCAN

    select n_plan_izd 
    LOCATE FOR n_plan_izd.id_izd = plan_izd.id_izd

    * &#197;&#241;&#235;&#232; &#231;&#224;&#239;&#232;&#241;&#252; &#237;&#229; &#237;&#224;&#233;&#228;&#229;&#237;&#224;, &#242;&#238; &#241;&#238;&#231;&#228;&#224;&#229;&#236; &#239;&#243;&#241;&#242;&#243;&#254; &#231;&#224;&#239;&#232;&#241;&#252;
    if found() = .F.
        append blank
    endif
replace n_plan_izd.id_izd WITH plan_izd.id_izd, ;
n_plan_izd.st_trud WITH plan_izd.st_trud, ;
n_plan_izd.plan_g WITH plan_izd.plan_g,  ;
n_plan_izd.plan_1kv WITH plan_izd.plan_1kv,  ;
n_plan_izd.plan_2kv WITH plan_izd.plan_2kv,  ;
n_plan_izd.plan_3kv WITH plan_izd.plan_3kv,  ;
n_plan_izd.plan_4kv WITH plan_izd.plan_4kv,  ;
n_plan_izd.plan_1m WITH plan_izd.plan_1m,  ;
n_plan_izd.plan_2m WITH plan_izd.plan_2m,  ;
n_plan_izd.plan_3m WITH plan_izd.plan_3m,  ;
n_plan_izd.plan_4m WITH plan_izd.plan_4m,  ;
n_plan_izd.plan_5m WITH plan_izd.plan_5m,  ;
n_plan_izd.plan_6m WITH plan_izd.plan_6m,  ;
n_plan_izd.plan_7m WITH plan_izd.plan_7m,  ;
n_plan_izd.plan_8m WITH plan_izd.plan_8m,  ;
n_plan_izd.plan_9m WITH plan_izd.plan_9m,  ;
n_plan_izd.plan_10m WITH plan_izd.plan_10m,  ;
n_plan_izd.plan_11m WITH plan_izd.plan_11m,  ;
n_plan_izd.plan_12m WITH plan_izd.plan_12m 
   
 endscan

но все равно первую запись не берет, а в конце добавляет строку с нулевыми значениями???
10 сен 18, 17:34    [21670103]     Ответить | Цитировать Сообщить модератору
 Re: Замена данных в таблице.  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1402
andrepont,
вот примерный код для замены твоей портянки:
SCAN
SCATTER TO NAME TMP
SELECT n_plan_izd
LOCATE FOR n_plan_izd.id_izd = plan_izd.id_izd
IF NOT FOUND()
  APPEND BLANK
ENDIF
GATHER FROM NAME TMP
10 сен 18, 17:40    [21670112]     Ответить | Цитировать Сообщить модератору
 Re: Замена данных в таблице.  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1402
andrepont
но все равно первую запись не берет, а в конце добавляет строку с нулевыми значениями???
Ну так отладчик в зубы и по шагам проходишь и смотришь что, где как работает/не работает.
10 сен 18, 17:44    [21670120]     Ответить | Цитировать Сообщить модератору
 Re: Замена данных в таблице.  [new]
andrepont
Member

Откуда:
Сообщений: 41
В итоге так:
SET STEP ON
select plan_izd
SCAN
SCATTER NAME TMP
SELECT n_plan_izd
LOCATE FOR n_plan_izd.id_izd = plan_izd.id_izd
IF NOT FOUND()
  APPEND BLANK
ENDIF
GATHER NAME TMP
endscan

смотрел через отладчик первый массив с переменными создаёт сразу с данными второй строки. Не понимаю в чем проблема.
10 сен 18, 18:59    [21670193]     Ответить | Цитировать Сообщить модератору
 Re: Замена данных в таблице.  [new]
andrepont
Member

Откуда:
Сообщений: 41
Разобрался в чем дело. В первой таблице первая запись была помечена на удаление.
10 сен 18, 19:27    [21670216]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить