powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Замена данных в таблице.
13 сообщений из 13, страница 1 из 1
Замена данных в таблице.
    #39700498
andrepont
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Есть две таблицы plan_izd и n_plan_izd необходимо перенести данные из таблицы plan_izd в n_plan_izd, при условии если запись с таким id_izd существует строку перезаписать, а если нет то создать строку и записать. Вот код что не так?
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
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
...
Рейтинг: 0 / 0
Замена данных в таблице.
    #39700510
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrepont,
в коде, вроде бы, всё "так". Но вот вы совершенно ничего не рассказали о причинах поиска "не так" в этом коде. Не обновляется? Не добавляется? Добавляется не то? Что-то еще?
...
Рейтинг: 0 / 0
Замена данных в таблице.
    #39700521
andrepont
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При выполнении кода нужно поочередно сравнить данные в таблице n_plan_izd с данными в таблице plan_izd если запись в поле n_plan_izd.id_izd=plan_izd.id_izd то поля в этой строке нужно заменить, а если <> то создать новую строку. А у меня при выполнении этого не происходит. Может перед locate нужно scan select plan_izd добавить?
...
Рейтинг: 0 / 0
Замена данных в таблице.
    #39700533
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrepontЗдравствуйте. Есть две таблицы plan_izd и n_plan_izd необходимо перенести данные из таблицы plan_izd в n_plan_izd, при условии если запись с таким id_izd существует строку перезаписать, а если нет то создать строку и записать. Вот код что не так?

Не так вот что
Код: javascript
1.
replace all n_plan_izd.id_izd WITH plan_izd.id_izd, ;


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

То что тебе надо пишется так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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()
...
Рейтинг: 0 / 0
Замена данных в таблице.
    #39700534
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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
...
Рейтинг: 0 / 0
Замена данных в таблице.
    #39700536
andrepont
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дописал вот так
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
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


но почему то первую строку не записывает и в конце таблицы добавляет строку с нулями
...
Рейтинг: 0 / 0
Замена данных в таблице.
    #39700545
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrepontДописал вот так
Надо так
Код: sql
1.
2.
3.
4.
5.
6.
SELECT plan_izd
SCAN
SELECT n_plan_izd
go top && Это лишнее
LOCATE FOR n_plan_izd.id_izd == plan_izd.id_izd
...
...
Рейтинг: 0 / 0
Замена данных в таблице.
    #39700546
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrepont,
а теперь сравните ваши два replace'а. Вам не кажется, что в любом случае выполняется одно и тоже и что replace надо оставить один, но за endif?
...
Рейтинг: 0 / 0
Замена данных в таблице.
    #39700556
andrepont
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сейчас вот так:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
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


но все равно первую запись не берет, а в конце добавляет строку с нулевыми значениями???
...
Рейтинг: 0 / 0
Замена данных в таблице.
    #39700563
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrepont,
вот примерный код для замены твоей портянки:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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
...
Рейтинг: 0 / 0
Замена данных в таблице.
    #39700569
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrepontно все равно первую запись не берет, а в конце добавляет строку с нулевыми значениями???Ну так отладчик в зубы и по шагам проходишь и смотришь что, где как работает/не работает.
...
Рейтинг: 0 / 0
Замена данных в таблице.
    #39700610
andrepont
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В итоге так:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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


смотрел через отладчик первый массив с переменными создаёт сразу с данными второй строки. Не понимаю в чем проблема.
...
Рейтинг: 0 / 0
Замена данных в таблице.
    #39700624
andrepont
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разобрался в чем дело. В первой таблице первая запись была помечена на удаление.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Замена данных в таблице.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]