powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Перенос данных
7 сообщений из 7, страница 1 из 1
Перенос данных
    #37418442
npp2202
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, уважаемые форумчане
Помогите решить проблему:
Есть две БД - 1.dbf и 2.dbf (см. приложение)
необходимо реализовать распределение данных из 1 в 2 в зависимости от id и usl, т.е.

табл 1: строка 1: id = 1, находим id в табл.2, таблица 1 если usl = 'О' в табл 2 записываем sum в sum_o, переписываем dat
табл 1: строка 2: id = 1, находим id в табл.2, таблица 1 если usl = 'A' в табл 2 записываем sum в sum_a
табл 1: строка 3: id = 2, находим id в табл.2, таблица 1 если usl = 'О' в табл 2 записываем sum в sum_o
табл 1: строка 4: id = 5, находим id в табл.2, таблица 1 если usl = 'О' в табл 2 записываем sum в sum_o
...
Рейтинг: 0 / 0
Перенос данных
    #37418469
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как пытался задачу порешать? Что конкретно не получилось?
...
Рейтинг: 0 / 0
Перенос данных
    #37418485
npp2202
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,
примерно так:

SELECT 2
GO TOP
DO WHILE !EOF()
LOCATE FOR 1.id = 2.id
IF !EOF()
IF 1.usl = "A" THEN
SELECT 3
replace 2.sum_a WITH 1.sum, 2.DAT WITH 1.DAT
replace 2.sum WITH 2.sum_a+2.sum_o
ENDIF
SELECT 2
SKIP
ENDIF
ENDDO
...
Рейтинг: 0 / 0
Перенос данных
    #37418516
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Не надо называть таблицы цифрами, имя должно с буквы начинаться, иначе проблемы с переключением между рабочими областями командой SELECT, т.к. она цифру воспринимает как номер области, а не название таблицы. Если уж цифрами названо и это никак не поменять то так открывать:
Код: plaintext
use  1 .dbf alias T1
далее обращаться по Т1.field

2. Код пытался осмыслить?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT  2  && я так понимаю это T1 ?
GO TOP
DO WHILE !EOF()
  SELECT T2
  LOCATE FOR  1 .id =  2 .id && У тебя поиск происходит в  T1, т.к. надо было предварительно переключиться SELECT T2
  IF FOUND() && FOUND() возвращает .Т. если LOCATE нашел нужное
    IF  1 .usl = "A" THEN 
      SELECT  3  
      replace  2 .sum_a WITH  1 .sum,  2 .DAT WITH  1 .DAT
      replace  2 .sum WITH  2 .sum_a+ 2 .sum_o 
    ENDIF
    SELECT  2 
    SKIP
  ENDIF 
ENDDO
...
Рейтинг: 0 / 0
Перенос данных
    #37418518
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не заметил, зациклится если не найдет, еще надо в конце SKIP за ENDIF вынести
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
...
DO WHILE !EOF()
  ....
  IF FOUND() 
    ...
  ENDIF 
  SELECT  2 
  SKIP
ENDDO

В фоксе есть цикл SCAN который аналогичен DO WHILE !EOF() со SKIP, т.е. так
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT T1
SCAN
  ....
  IF FOUND() 
    ...
  ENDIF 
ENDSCAN
...
Рейтинг: 0 / 0
Перенос данных
    #37418531
npp2202
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

спасибо, сейчас попробую
я только учусь, поэтому такие странности возникают
...
Рейтинг: 0 / 0
Перенос данных
    #37418717
npp2202
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
npp2202,

вот что получилось (вместе с реальнымим ключами и именами БД)

SELECT reestr
GO TOP
DO WHILE !EOF()

SELECT oplat

replace oplat.sum_v WITH IIF(reestr.usl = 'ВОДА', reestr.sum, oplat.sum_v);
oplat.sum_k WITH IIF(reestr.usl = 'ВОДО', reestr.sum, oplat.sum_k);
oplat.sum WITH oplat.sum_v + oplat.sum_k

SELECT reestr
skip

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


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