Поиск и замена значений VFP 9 из двух таблиц - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть файл bdf для университетского проекта, для которого я хотел бы извлечь из другой таблицы значение, соответствующее условию соответствия, протестировав каждую запись (что у них один и тот же идентификатор id_number и они не соответствуют другое условие). Я застрял с этим, так как при выполнении замены он берет только первое справочное значение из таблицы (а не то, которое соответствует условию). Те, у кого нет условия 1.Mp_id == d2.po для добавления ship2 в таблицу ссылок, а для остальных, которые не удовлетворяют условию, добавляют ship2 в поисках параметра prod_code для извлечения ship2 из справочной таблицы.

CLOSE DATABASES
USE Ruta + "FILE.dbf" IN 0 ALIAS d1
USE Ruta2 + "REFERENCE.dbf" IN 0 ALIAS d2
SELECT d1
ALTER TABLE d1 ADD COLUMN ship c(10) &&create new column to fill in the reference
SELECT d2
GO TOP
DO WHILE !EOF()
  SELECT d1
  REPLACE d1.ship WITH d2.ship2 FOR d1.Mp_id == d2.po
  REPLACE d1.ship WITH d2.ship2 FOR d1.prod_code == d2.prod AND d1.Mp_id != d2.po
  SELECT d2
  SKIP
ENDDO
CLOSE DATABASES ALL

Большое спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Как я уже сказал, неясно, что вы пытаетесь сделать без каких-либо примеров данных и примеров вывода.

Вы можете заменить это do while ... enddo следующим оператором обновления:

Update d1 ;
    Set ship = d2.ship ;
    from d2 ;
    where d1.Mp_Id == d2.po Or d1.Prod_Code == d2.Prod
0 голосов
/ 04 сентября 2018

К сожалению, «предоставление» вам кода не «учит» вас тому, как это сделать.
Следующий код был записан быстро и не тестировался, но если вы потратите некоторое время на рекомендуемые обучающие видеоролики, вы сможете определить, будет ли работать следующее для вас, а если нет, то, что, возможно, придется изменить.

USE Ruta2 + "REFERENCE.dbf" IN 0 ALIAS d2 EXCL  && Open 'Child' table
SELECT D2
INDEX ON po TAG Po  && Index table on po field values
INDEX ON prod TAG Prod  && Index table on prod field values
SET ORDER TO po  && 'Activate' 'child' table Po index

USE Ruta + "FILE.dbf" IN 0 ALIAS d1   && Open 'Parent' table
SELECT D1
ALTER TABLE d1 ADD COLUMN ship c(10) &&create new column to fill in the reference
SET RELATION TO id INTO D2  && set relation such that d1.id = d2.po
REPLACE ALL d1.ship with d2.ship2 FOR !EMPTY(d2.po)

SELECT D2
SET ORDER TO Prod  && 'Activate' 'child' table Prod index
SELECT D1
SET RELATION TO prod_code INTO D2  && set relation such that d1.prod_code = d2.prod
REPLACE ALL d1.ship WITH d2.ship2 FOR !EMPTY(d2.prod) AND d1.Mp_id != d2.po  

Удачи

...