Página 2 de 2

DOS Error 2

Enviado: 18 Set 2021 09:50
por Kapiaba
Bom dia. Tente assim:

Código: Selecionar todos

// \samples\SSFLAVIO.PRG

FUNCTION NET_ARQ()

   PARAMETERS PFILE, PINDEX, PEXCLU, APELID

   PRIVATE I, INDICE1, INDICE2, INDICE3, INDICE4, INDICE5, INDICE6, INDICE7, ;
           INDICE8, LERRO

   APELID := IF( Type( 'APELID' ) # 'C', '',  APELID )
   PINDEX := IF( Type( 'PINDEX' ) # 'C', '',  PINDEX )
   PEXCLU := IF( Type( 'PEXCLU' ) # 'L', .F., PEXCLU )
   LERRO  := ST()

   SELE 0

   FOR I = 1 TO 10

      IF PEXCLU // EXCLUSIVO

         USE &PFILE NEW EXCLUSIVE ALIAS &APELID

      ELSE  // COMPARTILHADO.

         USE &PFILE NEW SHARED ALIAS &APELID

      ENDIF

      IF Used()  // ESTA EM USO

         EXIT

      ENDIF

      FORMAT( 'Tentando abrir ' + PFILE, 24, 'C' )

      INKEY( .5 )

   NEXT

   RT( LERRO )

   IF Used()

      INDICE1 := PARSE( @PINDEX )
      INDICE2 := PARSE( @PINDEX )
      INDICE3 := PARSE( @PINDEX )
      INDICE4 := PARSE( @PINDEX )
      INDICE5 := PARSE( @PINDEX )
      INDICE6 := PARSE( @PINDEX )
      INDICE7 := PARSE( @PINDEX )
      INDICE8 := PARSE( @PINDEX )

      // EU MUDARIA PARA .CDX
      SET INDEX TO &INDICE1., &INDICE2., &INDICE3., &INDICE4., &INDICE5.,    ;
                   &INDICE6., &INDICE7., &INDICE8.

   ENDIF

RETURN( Used() )
Regards, saludos.

DOS Error 2

Enviado: 20 Set 2021 11:44
por ssflavio
Jairo Maia escreveu:
ssflavio escreveu:Depois que migrei o sistema de clipper para harbour, tem ocorrido com muita frequencia o seguinte erro:

Error DBFNTX/1003 Erro de abertura: SGC_RMO6.ntx (DOS Error 2)
Verifique se esse servidor está usando recursos de economia de energia. Se estiver, desative. Servidores não podem usar recursos que deixam o HDD desligar ou ficar em soneca, no primeiro momento ocorre exatamente o que relatou, depois ao tentar novamente o HDD já acordou e dá certo. Verifique se não é isso...
Obrigado pela dica Jairo!
nunca imaginei que iria encontrar uma das opções de energia com valor. DESLIGAR HD DEPOIS DE 20 MIN. Já alterei para nunca.

GRATIDÃO IRMÃO!!!

DOS Error 2

Enviado: 20 Set 2021 11:56
por ssflavio
JoséQuintas escreveu:Funcionaria mesmo no Clipper, mas teria que criar a função hb_Default() no Clipper:

Código: Selecionar todos


FUNCTION NET_ARQ( cDBFName, cIndexList, lExclusive, cAlias )

   LOCAL I, lErro, cNtxName, lIndex := .F.

   hb_Default( @cAlias, "" )
   hb_Default( @cIndexList, "" )
   hb_Default( @lExclusive, .F. )
   lErro := st()

   SELECT 0
   FOR I = 1 to 10
      IF lExclusive
         IF Empty( cAlias )
            USE ( cDbfName ) EXCLUSIVE
         ELSE
            USE ( cDbfName ) EXCLUSIVE ALIAS &( cAlias )
         ENDIF
      ELSE
         IF Empty( cAlias )
            USE ( cDBFName )
         ELSE
            USE ( cDBFName ) ALIAS &( cAlias )
         ENDIF
      ENDIF
      IF used()
         EXIT
      ENDIF
      format( 'Tentando abrir ' + cDBFName, 24, 'C' )
      Inkey(1)
   NEXT

   rt( lErro )

   IF Used()
      DO WHILE ! Empty( cNtxName := Parse( @cIndexList ) )
         dbSetIndex( cNtxName )
         lIndex := .T.
      ENDDO
      IF lIndex
         SET ORDER TO 1
      ENDIF
   ENDIF

   RETURN Used()
A lista de índices, também poderia ser array, o que talvez simplificasse.
NÃO sei o que Parse() faz, provavelmente daria pra substituir por hb_RegExSplit()

Código: Selecionar todos

&( expressao )
Isso permite fazer macro do resultado da expressao, ao invés da variável diretamente.
Evita gambiarra, e no Harbour evita problemas com variáveis LOCAL.
E expande possibilidades:

Código: Selecionar todos

&( "indice" + Str( 1, 1 ) )
Caro José Quintas, muito obrigado pela atenção!
lendo o seu post, fiquei até ciom vergonha!
essa rotina está um lixo!
mas é a rotina que funcionou sempre e que nunca sofreu alteração. Ela foi escrita para Clipper em 1993 (vaz tempo eim amigão!)

agradeço a dica do hb_default(), não conhecia esta função! Vou começar a usa-la a partir de agora

quanto a função parse(), cada vez que é chamada ela retorna um string até o proxima "," e vai removendo do string original, até não ter mais nada dentro dela

Código: Selecionar todos

function PARSE(LINPUT, SEP)

local LOUTPUT, K

if SEP == NIL
   SEP := ','
endif

K := at(SEP,LINPUT)
if K > 0
   LOUTPUT := substr(LINPUT,1,K-1)
   LINPUT  := substr(LINPUT,K+1)
else
   LOUTPUT := LINPUT
   LINPUT  := ''
endif
return(LOUTPUT)
GRATIDÃO PELO ENSINAMENTO!

DOS Error 2

Enviado: 20 Set 2021 13:17
por JoséQuintas
Se está familiarizado com array, assim retorna a lista completa de uma vez.
Vai também com uso de FOR EACH:

Código: Selecionar todos

lTemIndex := .F.
aList := hb_RegExSplit( ",", cIndexList )
FOR EACH cNome IN aList
   dbSetIndex( cNome )
   lTemIndex := .T.
NEXT
IF lTemIndex
   SET ORDER TO 1
ENDIF
Se puder atualizar pra CDX vai facilitar.
É porque com CDX, todos os índices de um DBF ficam em um único CDX, que pode ser o mesmo nome do arquivo DBF.
Acaba eliminando a lista, e nunca vai esquecer de abrir nenhum, porque fica tudo junto.

Mas isso deixa pra uma próxima etapa, pra não complicar a migração agora.