Форум » [x]Harbour » Delete Field » Ответить

Delete Field

Dima: Есть ли готовая функция для удаления поля из базы ? Понятно что можно свою сделать , но вдруг уже есть такое.

Ответов - 6

Dima: Проехали

Haz: Dima пишет: проехали Ads? ALTER TABLE ... DROP COLUMN ...

Dima: Haz пишет: Ads? Неа.


SergKis: Dima пишет Неа Понимаю, что "дорога ложка к обеду" и уже Проехали, но выложу, может пригодится кому [pre2] *-----------------------------------------------------------------------* FUNCTION myDbStruMod( aStru, cFile ) *-----------------------------------------------------------------------* LOCAL i, cAls, cNew, cExt, nOld := select() If Empty( cFile ) .or. !myDbUse( cFile ) dbSelectArea(nOld) RETURN .F. EndIf cAls := Alias() cNew := hb_FNameExtSet( lower(dbInfo(DBI_FULLPATH)), "" ) + '_new_stru' cExt := lower(dbInfo(DBI_TABLEEXT)) USE i := Set( _SET_DELETED, .F. ) dbCreate( cNew, aStru, , .T., cAls+'_NEW' ) APPEND FROM ( cFile ) GO TOP USE Set( _SET_DELETED, i ) fErase( hb_FNameExtSet(cFile, IndexExt()) ) If ( i := empty(fErase( cFile )) ) i := empty(fRename( cNew + cExt, cFile )) EndIf If ! i fErase( cNew + cExt ) dbSelectArea(nOld) RETURN .F. EndIf dbSelectArea(nOld) RETURN .T. *-----------------------------------------------------------------------* FUNCTION myDbUse( cDbf, cAls, lShared, cRdd, nWhl ) *-----------------------------------------------------------------------* LOCAL lRet := .F., nOld := Select() DEFAULT lShared TO .T., nWhl TO 10 cDbf := hb_FNameExtSet( cDbf, ".dbf" ) ; NetErr( .F. ) IF !hb_FileExists(cDbf) ; RETURN lRet ENDIF SELECT 0 IF empty (cAls) ; cAls := '_XYZ_'+hb_ntos(select()) ELSEIF select(cAls) > 0 ; cAls += '_' +hb_ntos(select()) ENDIF DO WHILE nWhl-- > 0 lRet := .F. BEGIN SEQUENCE WITH { |e|break(e) } DbUseArea( .F., cRdd, cDbf, cAls, lShared ) lRet := ! NetErr() .and. Used() END SEQUENCE IF lRet; EXIT ENDIF wApi_Sleep(100) ENDDO IF lRet If OrdCount() > 0 ; OrdSetFocus(1) EndIf dbGoTop() ELSE dbSelectArea(nOld) ENDIF RETURN lRet *-----------------------------------------------------------------------* FUNCTION myStruAddFields(aStru, aFields, nPos) *-----------------------------------------------------------------------* LOCAL oStru := oHmgData(), aField Default nPos := 0 // insert before position if nPos > 0 IF !hb_IsArray(aFields[1]) ; aFields := { aFields } ENDIF IF nPos > 0 FOR EACH aField IN aStru IF hb_enumIndex(aField) == nPos AEval(aFields, {|a| oStru:Set(a[1], aClone(a)) }) ELSE oStru:Set(aField[1], aField) ENDIF NEXT ELSE AEval(aStru , {|a| oStru:Set(a[1], a) }) AEval(aFields, {|a| oStru:Set(a[1], a) }) ENDIF RETURN oStru:Values() *-----------------------------------------------------------------------* FUNCTION myStruDelFields(aStru, cFields) *-----------------------------------------------------------------------* LOCAL aField, aStruNew := {} cFields := "," + upper(StrTran(cFields, " ", "")) + "," FOR EACH aField IN aStru IF ! ","+aField[1]+"," $ cFields AAdd(aStruNew, aField) ENDIF NEXT RETURN aStruNew *-----------------------------------------------------------------------* FUNCTION myDbDelFields(cFile, cFields) *-----------------------------------------------------------------------* LOCAL lRet := .F., aStru IF Empty(cFields) .or. !hb_IsChar(cFields) ; RETURN lRet ELSEIF !myDbUse(cFile, , .F.) /*EXCLUSIVE*/ ; RETURN lRet ENDIF aStru := dbStruct() USE aStru := myStruDelFields(aStru, cFields) IF Len(aStru) > 0 ; lRet := myDbStruMod( aStru, cFile ) ENDIF RETURN lRet *-----------------------------------------------------------------------* FUNCTION myDbAddFields(cFile, aFields, nPos) *-----------------------------------------------------------------------* LOCAL lRet := .F., aStru IF !myDbUse(cFile, , .F.) /*EXCLUSIVE*/ ; RETURN lRet ENDIF aStru := dbStruct() USE aStru := myStruAddFields(aStru, aFields, nPos) IF Len(aStru) > 0 ; lRet := myDbStruMod( aStru, cFile ) ENDIF RETURN lRet [/pre2] В примерах minigui есть Customer.dbf, на него можно делать[pre2] myDbDelFields("Customer.dbf", "TaxRate, LastInvoic") myDbAddFields("Customer.dbf", {{"Tax1", "N", 10, 3}, ; {"Inv1", "C", 20, 0}}) myDbAddFields("Customer.dbf", {{"Tax0", "N", 10, 3}, ; {"Inv0", "C", 20, 0}}, 5) [/pre2]

Dima: SergKis Сделал несколько проще , так как разовая функция [pre2] #include "Dbstruct.ch" DeleteField("zchet_f","naim") Func DeleteField(als,cfield) Local Astruct,i Local cf:=numtohex(hb_MilliSeconds(),8) use (als) new Astruct:=(als)->(Dbstruct()) i:=ascan(Astruct,{|a| a[DBS_NAME]==UPPER(cfield)}) if i==0 close all return nil else Astruct:=hb_adel(Astruct,i,.t.) endif close (als) Dbcreate(cf,Astruct, ,.t.,"tstnew") append from (als) close all ferase(als+".dbf") frename(cf+".dbf",als+".dbf") return nil [/pre2]

SergKis: Dima пишет Сделал несколько проще , так как разовая функция Но модификация структур dbf таблиц может быть нужна в работе, у себя выкусил из кода и немного почистил, положил. PS. Вместо oHmgData() можно использовать работу с Hash функциями, использую, что бы исключить дублирование имен полей



полная версия страницы