Visual FoxPro 'Таблицы обновлений не указаны. Использовать свойство таблицы курсора 'ошибка возникает при обновлении - PullRequest
0 голосов
/ 09 июля 2020

Мне пришлось обновить представление vfp, чтобы оно работало быстрее. До этого изменения базовая таблица (schdrate) обновлялась нормально. Теперь я получаю сообщение «Не указаны таблицы обновлений. Используйте свойство таблицы курсора '.

Я попытался преобразовать приведенное ниже представление в представление, чтобы увидеть, сработало ли это, и получаю сообщение «Обновление или вставка представления или функции schdrateView» не удалось, поскольку оно содержит производный или поле констант '

Есть идеи, почему я получаю ошибку «Не указаны таблицы обновлений», когда у меня установлено свойство таблиц?

DEFINE CLASS ccVschdrate As imView
    ViewName = "vschdrate"
    KeyFieldList = "schdrate_id"
    Tables = "incedo.schdrate"
    SendUpdates = .T.
    BUFFERING  = 0  && Turn Buffering off
    SQL = "select  schdrate.*, descript from ( " + ;
        " select distinct a.loc_id,RTRIM(LTRIM(b.short_desc)) + ' - ' + RTRIM(LTRIM(c.short_desc)) + ' - ' + d.descript AS descript " + ;
        " from LOC A " + ;
        " INNER JOIN loctocpt WITH (NOLOCK) ON a.loc_id = loctocpt.loc_id " + ;
        " INNER JOIN proccode WITH (NOLOCK) ON loctocpt.proc_id = proccode.proc_id " + ;
        " INNER JOIN CodeModPOS WITH (NOLOCK) ON ProcCode.Proc_ID = CodeModPOS.Proc_ID " + ;
        " LEFT OUTER JOIN loc_x_codemodpos x WITH (NOLOCK) ON x.CodeModPOS_ID = CodeModPOS.CodeModPOS_ID AND x.loc_id = loctocpt.loc_id " + ;
        " INNER JOIN caretype b WITH (NOLOCK) ON b.type_id = a.type_id " + ;
        " INNER JOIN careinte c WITH (NOLOCK) ON c.care_id = a.care_id " + ;
        " INNER JOIN caremode d WITH (NOLOCK) ON d.mode_id = a.mode_id " + ;
        " INNER JOIN caresett e WITH (NOLOCK) ON c.setting_id = e.setting_id " + ;
        " INNER JOIN careleve f WITH (NOLOCK) ON c.level_id = f.level_id " + ;
        " WHERE x.CodeModPOS_ID IS NULL AND prim_cpt = 1 AND proccode.proc_id NOT IN (SELECT proc_id " + ;
        " FROM codemodpos " + ;
        " INNER JOIN loc_x_codemodpos x WITH (NOLOCK) ON x.CodeModPOS_ID = CodeModPOS.CodeModPOS_ID ))a " + ;
        " INNER JOIN schdrate WITH (NOLOCK) ON a.loc_id = schdrate.loc_id " + ;
        " UNION " + ;
        " select schdrate.*,RTRIM(LTRIM(b.short_desc)) + ' - ' + RTRIM(LTRIM(c.short_desc)) + ' - ' + d.descript AS descript " + ;
        " from schdrate " + ;
        " INNER JOIN loc a WITH (NOLOCK) ON a.loc_id = schdrate.loc_id " + ;
        " LEFT OUTER JOIN loctocpt WITH (NOLOCK) ON a.loc_id = loctocpt.loc_id " + ;
        " LEFT OUTER JOIN proccode WITH (NOLOCK) ON loctocpt.proc_id = proccode.proc_id " + ;
        " LEFT OUTER JOIN CodeModPOS WITH (NOLOCK) ON ProcCode.Proc_ID = CodeModPOS.Proc_ID " + ;
        " INNER JOIN caretype b WITH (NOLOCK) ON b.type_id = a.type_id " + ;
        " INNER JOIN careinte c WITH (NOLOCK) ON c.care_id = a.care_id " + ;
        " INNER JOIN caremode d WITH (NOLOCK) ON d.mode_id = a.mode_id " + ;
        " INNER JOIN caresett e WITH (NOLOCK) ON c.setting_id = e.setting_id " + ;
        " INNER JOIN careleve f WITH (NOLOCK) ON c.level_id = f.level_id " + ;
        " WHERE CodeModPOS.Proc_ID IS NULL " + ;
        " UNION " + ;
        " select schdrate.*,RTRIM(LTRIM(b.short_desc)) + ' - ' + RTRIM(LTRIM(c.short_desc)) + ' - ' + d.descript AS descript " + ;
        " from schdrate " + ;
        " INNER JOIN loc a ON a.loc_id = schdrate.loc_id INNER JOIN loctocpt WITH (NOLOCK) ON a.loc_id = loctocpt.loc_id " + ;
        " INNER JOIN proccode WITH (NOLOCK) ON loctocpt.proc_id = proccode.proc_id " + ;
        " INNER JOIN CodeModPOS WITH (NOLOCK) ON ProcCode.Proc_ID = CodeModPOS.Proc_ID " + ;
        " INNER JOIN loc_x_codemodpos x WITH (NOLOCK) ON x.CodeModPOS_ID = CodeModPOS.CodeModPOS_ID AND x.loc_id = loctocpt.loc_id " + ;
        " INNER JOIN caretype b WITH (NOLOCK) ON b.type_id = a.type_id INNER JOIN careinte c WITH (NOLOCK) ON c.care_id = a.care_id " + ;
        " INNER JOIN caremode d WITH (NOLOCK) ON d.mode_id = a.mode_id INNER JOIN caresett e WITH (NOLOCK) ON c.setting_id = e.setting_id " + ;
        " INNER JOIN careleve f WITH (NOLOCK) ON c.level_id = f.level_id " + ;
        " UNION " + ;
        " select schdrate.*,RTRIM(LTRIM(b.short_desc)) + ' - ' + RTRIM(LTRIM(c.short_desc)) + ' - ' + d.descript AS descript " + ;
        " from schdrate " + ;
        " INNER JOIN loc a WITH (NOLOCK) ON a.loc_id = schdrate.loc_id " + ;
        " INNER JOIN loctocpt WITH (NOLOCK) ON a.loc_id = loctocpt.loc_id " + ;
        " INNER JOIN proccode WITH (NOLOCK) ON loctocpt.proc_id = proccode.proc_id " + ;
        " INNER JOIN CodeModPOS WITH (NOLOCK) ON ProcCode.Proc_ID = CodeModPOS.Proc_ID " + ;
        " LEFT OUTER JOIN loc_x_codemodpos x WITH (NOLOCK) ON x.CodeModPOS_ID = CodeModPOS.CodeModPOS_ID AND x.loc_id = loctocpt.loc_id " + ;
        " INNER JOIN caretype b WITH (NOLOCK) ON b.type_id = a.type_id " + ;
        " INNER JOIN careinte c WITH (NOLOCK) ON c.care_id = a.care_id " + ;
        " INNER JOIN caremode d WITH (NOLOCK) ON d.mode_id = a.mode_id " + ;
        " INNER JOIN caresett e WITH (NOLOCK) ON c.setting_id = e.setting_id " + ; 
        " INNER JOIN careleve f WITH (NOLOCK) ON c.level_id = f.level_id " + ;
        " WHERE loctocpt.PROC_ID in (Select PROC_ID from CodeModPOS inner join loc_x_codemodpos New on New.CodeModPOS_ID = codemodpos.CodeModPOS_ID) and " + ;
        " Codemodpos.CodeModPOS_ID not in (select CodeModPOS_ID from loc_x_codemodpos new1 ) and x.CodeModPOS_ID IS NULL "
        
    PROCEDURE Init(tcViewName, tNodata)
        DODEFAULT(tcViewName, tNodata)
        IF !EOF()
            **INDEX ON RatesLOC(ASUBS(RatesLOC,ASCAN(RatesLOC,vschdrate.loc_id),1),2) TAG PrimName
            INDEX ON PADR(ALLTRIM(descript),100) TAG PrimName
        ENDIF
        This.Buffering = DB_BUFOPTTABLE && Turn Buffering on
        THIS.SetCursorProps
    ENDPROC
ENDDEFINE

Ниже приведен базовый класс, в котором свойства набор

FUNCTION imMakeCursorUpdate(tcAlias, cTable, cKeyField, lIsIdentity)
    *> makes cursor after SQLEXEC updatable
    *> assumes that field names are the same
    LOCAL i, cNameList, cFieldList, lnOldSelect

    lnOldSelect = SELECT()
    SELECT (tcAlias)

    STORE "" TO cNameList, cFieldList
    FOR i = 1 TO FCOUNT()
        cNameList  = cNameList  + FIELD(i) + " " + cTable +"."+FIELD(i)+","
        cFieldList = cFieldList + FIELD(i) + ","
    NEXT

    *> 100128 - SKG - If using identity don't include the keyfield in the UpdateagleFieldList   
    IF lIsIdentity = .t.
        cFieldList = STRTRAN(cFieldList, ALLTRIM(cKeyField), [],1,1,3)
        cFieldList = STRTRAN(cFieldList, [,,], [,])
        cFieldList = STRTRAN(cFieldList, [  ,], [,])
        cFieldList = STRTRAN(cFieldList, [ ,], [,])
        
        IF LEFT(cFieldList,1) = [,]
            cFieldList = SUBSTR(cFieldList,2)
        ENDIF
    ENDIF
    
    cNameList  = LEFT(cNameList, LEN(cNameList)-1)
    cFieldList = LEFT(cFieldList, LEN(cFieldList)-1)
    CURSORSETPROP("tables", cTable)
    CURSORSETPROP("buffering", 5)
    CURSORSETPROP("wheretype", 3)
    CURSORSETPROP("updatenamelist", cNameList)
    CURSORSETPROP("keyfieldlist", cKeyField)
    CURSORSETPROP("updatablefieldlist", cFieldList)
    CURSORSETPROP("sendupdates", .T.)
    
    SELECT (lnOldSelect)
ENDFUNC

1 Ответ

0 голосов
/ 09 июля 2020

Вам не хватает свойства UpdateNameList, которое сопоставляет поля в представлении с полями, которые они обновляют.

...